【发布时间】:2014-11-10 11:46:37
【问题描述】:
有没有办法在 Java 中实现多分类?例如,以这个 UML 图为例 -
GrainCrop类应该如何实现?
【问题讨论】:
-
是的,这个问题确实以前被问过。感谢您指出。
有没有办法在 Java 中实现多分类?例如,以这个 UML 图为例 -
GrainCrop类应该如何实现?
【问题讨论】:
接口。 Crop 和FoodItem 之一或两者将是由GrainCrop 实现的接口。所以要么:
GrainCrop 是 Crop (并继承其行为)并表现出FoodItem 的行为。在这种情况下,Crop 是一个基类(可能是抽象的),FoodItem 是一个接口。GrainCrop 是 FoodItem (并继承其行为)并表现出Crop 的行为。在这种情况下,FoodItem 是一个基类(可能是抽象的),Crop 是一个接口。GrainCrop 表现出FoodItem 和Crop 的行为。在这种情况下,FoodItem 和 Crop 都是接口。在单继承环境中,您需要特别注意识别“是”什么与它表现出的行为。 (这也是为什么接口经常用行为来描述的原因之一,比如Eatable,而不是它们的结构,比如FoodItem。这使得建模更加清晰。)
作为一种经常方便的过度简化,将基类视为“是”什么,将接口视为“做什么”。一个对象只能是一件事,但它可以做很多事。
【讨论】:
Java 不支持类的多重继承,只有接口可以从多个接口继承。所以我要做的是,有问题的类GrainCrop 实现了其他两个类的接口。然后GrainCrop 聚合另外两个类并委托给“内部”对象。如果你需要做额外的事情,GrainCrop 中的调用也可以被修饰。例如
public void methodFromClassCrop() {
System.out.println("Stuff before call");
oneOfTheObjects.methodFromClassCrop();
System.out.println("Stuff after call");
}
当然,您只能为其中一个类引入接口并从另一个类继承。这取决于您的新类是否在某种意义上扩展了其他类之一:引入新的行为、算法、使用其他数据的数据,或者您是否只是对它们“采取行动”(在这种情况下是聚合)。
【讨论】:
好吧,鉴于 FeedItem 似乎没有任何实现,我会将其设为接口,将 Crop 设为类(可能是抽象的),并让 GrainCrop 扩展它们。您只能扩展一个类,但您可以扩展任意数量的接口。
【讨论】: