好吧,我希望你能理解我。我有两个班级,A
和B
。 B
是A
的子类。它们具有相同的公共方法并且意味着相同的东西,但是B做了一些不同的事情,所以它有其他方法和属性只使用自己。假设,类A实现了交互式创建对象的方法newFromWizard
。我可以根据用户输入实现逻辑,在A的newFromWizard
方法中创建一个对象A 或对象B 。我的意思是,我可以从该方法创建一个B对象吗?一个?或者我需要在其他地方实施?最好的方法是怎样做的?在实践中,我可以。但是,OOP是否正确?
顺便说一句,如果重要的话,我正在使用Smalltalk。
答案 0 :(得分:2)
是的,这是OO中众所周知的模式。在Objective-C Cocoa库中,您会发现它系统地应用,并且被称为类集群。结果是Cocoa库比等效的c#或java更容易理解。它允许在具有返回子类的类侧创建方法的抽象类后面隐藏继承层次结构。
答案 1 :(得分:1)
public class A{
public B method(){
B b = new B();
return b;
}
}
class B extends A{
}
如果这就是你所说的,那就是有效的。
答案 2 :(得分:0)
我会说这不是直观的做事方式。让我们简化它并说你只需重新定义new
。然后在某些时候,您执行A new
并获取B
的实例。它们相似的东西使它不那么糟糕。但想象一下其他人开始使用你的代码。并且hew知道消息new
应该导致创建接收器的实例。然后有些不同。我从概念上说这是错的。为什么现在要实现一些构建器类?并且有类似
createInstanceOfAB
|className|
className := "do what you need".
^ className asClass new.
这是一种更清晰的方式。
你可以再次使new…
方法做任何你想做的事情,甚至拍摄烟火,但是大多数人都希望它能创建同一类的实例
答案 3 :(得分:0)
我认为你不应该过分担心返回子类实例是否是“干净的OO”。它经常被使用和完成,因为它非常有用,并且与somme类型的工厂和东西相比,使您的代码更具可读性。
我最关心的是你应该仔细命名你的班级方法。不要使用#new可能是最重要的规则,但是你应该总是使用一个已经说过的名字:给我一个适当的实例。
我认为这不仅限于子类,这样的方法甚至可以返回不从类继承的对象。在动态类型语言中,这没关系。请记住,我们使用的是动态类型语言,因此只要您具有多态接口,只要对象响应您的消息发送,对象的类对用户就不重要了......