c# - 这个 Composition 是否违反了面向对象编程的任何原则?

标签 c# oop composition

假设我有以下两个类:

public class MyDevice
{
    int id;
    string name;
    // other resources

    public MyChannel CreateChannel()
    {
        return new MyChannel(this);
    }
} 

public class MyChannel
{
    int id;
    MyDevice _device;
    // other resources        

    public MyChannel(MyDevice device)
    {
        _device = device;
    }
}

实际上,每个设备都可以有可变数量的 channel 。所以关系是每个设备都有一个 channel 的集合。令我困扰的是代码编写方式 MyChannel 对象有一个 MyDevice 对象。但是代码中定义的关系更方便,我也想保持简单。

为了平息脑后的唠叨 - 我一直指出 SqlConnectionSqlCommand 的结构方式,其中每个 SqlCommand对象有一个 SqlConnection 对象,尽管每个 SQL 连接都有一系列 SQL 命令。

我是否违反了面向对象编程的任何原则/这段代码有异味吗?

编辑:

明确:在面向对象设计方面,将 has-a 关系放在头上是一个很大的禁忌吗?如果是这样,那么忽略/忽视的单一原则是什么?

最佳答案

我假设示例中所说的 Device 应该是 MyDevice。您基本上可以引用父 channel ,即设备。我不认为这会破坏 OO,而且在很多情况下很有用。纯粹主义者会说它打破了父级的封装,并创建了从 channel 到 channel 外和 channel 以外的任何事物的耦合。

关于c# - 这个 Composition 是否违反了面向对象编程的任何原则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29233818/

相关文章:

java - 在 Java 中设置 Map<K,V> 中的 <T>

c++ - 构造函数和转换

c# - 推送 bin/js 文件后,Servicestack 丢失 session ,直到缓存清除

c# - 如果在 C# 中存在,则修剪美元符号的简单方法

python - 重写实例方法的 getattribute 并使用方法输入变量

database-design - OO 数据模型 - 我可以忽略对象关系映射器约束吗?

c# - Thinktecture - 无法在 Web API 中处理加密的 SAML 安全 token

C# 如何插入零日期?

javascript - 如何构造一个 javascript 类以同时使用多个子方法?

objective-c - 了解何时使用继承来允许一个类使用另一个类的实例