【问题标题】:Implement multiple classification in Java [duplicate]在Java中实现多重分类[重复]
【发布时间】:2014-11-10 11:46:37
【问题描述】:

有没有办法在 Java 中实现多分类?例如,以这个 UML 图为例 -

GrainCrop类应该如何实现?

【问题讨论】:

标签: java oop uml


【解决方案1】:

接口。 CropFoodItem 之一或两者将是由GrainCrop 实现的接口。所以要么:

  1. GrainCrop Crop (并继承其行为)并表现出FoodItem 的行为。在这种情况下,Crop 是一个基类(可能是抽象的),FoodItem 是一个接口。
  2. GrainCrop FoodItem (并继承其行为)并表现出Crop 的行为。在这种情况下,FoodItem 是一个基类(可能是抽象的),Crop 是一个接口。
  3. GrainCrop 表现出FoodItemCrop 的行为。在这种情况下,FoodItemCrop 都是接口。

在单继承环境中,您需要特别注意识别“是”什么与它表现出的行为。 (这也是为什么接口经常用行为来描述的原因之一,比如Eatable,而不是它们的结构,比如FoodItem。这使得建模更加清晰。)

作为一种经常方便的过度简化,将基类视为“是”什么,将接口视为“做什么”。一个对象只能一件事,但它可以很多事。

【讨论】:

    【解决方案2】:

    Java 不支持类的多重继承,只有接口可以从多个接口继承。所以我要做的是,有问题的类GrainCrop 实现了其他两个类的接口。然后GrainCrop 聚合另外两个类并委托给“内部”对象。如果你需要做额外的事情,GrainCrop 中的调用也可以被修饰。例如

    public void methodFromClassCrop() {
        System.out.println("Stuff before call");
        oneOfTheObjects.methodFromClassCrop();
        System.out.println("Stuff after call");
    }
    

    当然,您只能为其中一个类引入接口并从另一个类继承。这取决于您的新类是否在某种意义上扩展了其他类之一:引入新的行为、算法、使用其他数据的数据,或者您是否只是对它们“采取行动”(在这种情况下是聚合)。

    【讨论】:

      【解决方案3】:

      好吧,鉴于 FeedItem 似乎没有任何实现,我会将其设为接口,将 Crop 设为类(可能是抽象的),并让 GrainCrop 扩展它们。您只能扩展一个类,但您可以扩展任意数量的接口。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-05-31
        • 2017-06-15
        • 2018-10-06
        • 1970-01-01
        • 1970-01-01
        • 2021-05-02
        • 2010-09-30
        • 1970-01-01
        相关资源
        最近更新 更多