这是不好的面向对象设计? (基类中使用的派生类)

时间:2010-05-14 00:48:16

标签: language-agnostic oop

有人能告诉我这个班级结构是不是很糟糕吗?

class abstract Parent{
  public Child Foo(){
    return new Child();
  }
}

class Child : Parent{}

我听说从基类型引用派生类型总是很糟糕并且设计不好的迹象。有人能告诉我为什么这是坏的,甚至是坏的?

4 个答案:

答案 0 :(得分:5)

在我看来,您正在使用基类作为工厂。我建议不要使用这种设计,因为它会降低基类的内聚力(它既是基类又是工厂),并且增加了基类中的耦合(因为它引用了派生类)。

创建一个与基类分开的工厂类,这些问题就会消失。

答案 1 :(得分:4)

要详细说明dkackman的答案,理想情况下,您的工厂将返回子类型的对象,但声明为父类型。

class Factory
{
    public Parent Foo()
    {
        return new Child();
    }

    public Parent Bar()
    {
        return new OtherChild();
    }
}

基本思想是你的调用代码不应该关心它返回哪个子类。这是Liskov替代原则的一个概念。

答案 2 :(得分:1)

在许多层面上肯定闻起来很糟糕。只要问问自己,如果有人延伸孩子,会发生什么;或者它是父(而不是孩子)的另一个子类。

很难想象一个可以证明这种设计合理的案例(也许它存在,你可以解释你想要实现的目标)。 (你熟悉工厂模式吗?)

在任何情况下,为了获得这种设计的合理行为,我猜应该接受并接受耦合,甚至尝试强制执行它,使Child类最终/密封(不可能扩展)并将这两个类视为整个。但话又说回来,这可以(几乎肯定)用另一种更清洁的设计来实现。

答案 3 :(得分:-1)

我不能说你的设计有什么问题。更具体地说,我必须知道你这样做的目的。但无论你的目的是什么,你都会想念多态性。因此,从客户端代码的角度来看,您只是为了获取子类实例而公开超类详细信息。为什么我们这样做?至少,我没有。记住设计原则,我们总是想要一个高度凝聚力的课程。在这里,您通过提供工厂方法来创建子类实例来打破这一原则。

rajan

相关问题