这个组合是否违反了面向对象编程的任何原则?

时间:2015-03-24 13:23:28

标签: 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;
    }
}

实际上,每个设备可以具有可变数量的通道。所以关系是每个设备都有一个频道集合。编写代码的方式MyChannel对象具有MyDevice对象,这让我感到困扰。但是,代码中定义的关系更方便,我也希望保持简单。

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

我是否违反了面向对象编程的任何原则/这段代码闻到了什么?

编辑:

明确地说:在面向对象的设计方面,转变它的关系是一个很大的禁忌吗?如果是这样,那么忽略了什么是单一的原则/忽略?

3 个答案:

答案 0 :(得分:3)

我假设示例所说的Device意味着MyDevice。您基本上可以引用父级即设备。我认为这不会破坏OO并且在许多情况下是有用的。纯粹主义者会说它破坏了父母的封装,并创建了从通道到通道外的任何东西的耦合。

答案 1 :(得分:2)

这并没有违反任何原则。您经常会有包含其他对象的对象。

我假设你的意思是MyChannel._device字段实际上是MyDevice?

此外,您可能需要考虑在MyDevice对象中包含MyChannel对象列表,以便在需要时更轻松地进行双向遍历。只需确保您在两个字段之间实施一致性。

答案 2 :(得分:2)

我认为这种模式原则上没有任何错误。有时,存在两个真正紧密耦合的类。

但是,我认为让你的频道类变为私有是一个非常好的主意,只使用CreateChannel方法实例化它,同时添加一个私有的频道对象集合公共吸气者,没有公共设定者作为您设备的成员。这样,您可以确保您的设备类始终控制其自己的通道。