有人能告诉我这个班级结构是不是很糟糕吗?
class abstract Parent{
public Child Foo(){
return new Child();
}
}
class Child : Parent{}
我听说从基类型引用派生类型总是很糟糕并且设计不好的迹象。有人能告诉我为什么这是坏的,甚至是坏的?
答案 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