【问题标题】:OOP Java: Better to extend a class or create a new instance of the subclass? [duplicate]OOP Java:更好地扩展类或创建子类的新实例? [复制]
【发布时间】:2023-03-08 21:58:01
【问题描述】:

我在面向对象编程的概念上遇到了麻烦。 扩展一个类还是在一个类中创建一个新对象更好? 在哪种情况下,您会扩展子类而不是在调用类中创建该子类的新实例?该示例使用 Java,但我想这些概念也适用于其他 OOP 语言。

感谢您的见解

class Mini {
// I want to use the members of this class in another class
    int myInt;

    public Mini(int myInt){
        this.myInt = myInt;
    }

    public int myMethod(){
        return this.myInt;
    }
}

// should I create a new instance of Mini here?
class Maxi {
    Mini myMini = new Mini(5);

    public Maxi(){
        int miniInt = myMini.myMethod();
        System.out.print(miniInt );
    }
}

// or should I have Maxi extend Mini?
class Maxi extends Mini {
    public Maxi(int myInt){
        System.out.print(this.myInt);
    }
}

【问题讨论】:

  • 这个问题似乎倾向于鼓励更多基于意见的答案,而不是严格客观的答案。通常,此类问题不适合 Stack Overflow。见:blog.stackoverflow.com/2010/09/good-subjective-bad-subjective
  • 根据经验:如果您无需创建子类即可轻松实现目标,则不应创建子类。好吧,除非存在明显的“x y”关系。
  • 它们是两种截然不同的东西。扩展您创建“是”关系的类,即 Maxi 是 Mini 的一种。如果你在 Maxi 中实例化一个 Mnin,那么它就是一个“包含”关系......
  • @luke:没有。在大多数情况下,将“梅赛德斯”和“宝马”作为汽车品牌的实例就足够了。他们确实为汽车的概念添加了一些新东西。这与制作“Car”的“RedCar”和“BlueCar”子类相同。不要这样做。

标签: java oop


【解决方案1】:

当一个类具有is-a 关系时,您可以扩展它。例如,CatAnimalCat 不是 CatFood,但它可能使用 CatFood

在你的情况下,我不确定MiniMaxi 是什么,但听起来Maxi 不是Mini,而是使用一个。

一般来说,尝试使用组合(使用对象)而不是继承,尤其是在像 java 这样的单继承语言中。

【讨论】:

    【解决方案2】:

    这个问题的最佳答案是另一个问题:B 类使用 A 类还是 B 类建立在 A 类之上?

    【讨论】:

      【解决方案3】:

      你应该问自己一个问题是这个类还有什么其他用途?你在子类中还需要这个类的功能吗?你会有更多的类也继承 mini 吗?

      我们的目标是避免重复。您需要更多地了解您的用例才能确定。

      如果你有不止一个东西扩展顶级类并使用它的功能和变量,我真的只会继承。如果您只是用于方法签名接口通常是更好的选择。

      【讨论】:

        【解决方案4】:
        • 第一种情况是聚合关系,名为 has-a。 Maxi 类有一个属性,其类型为 Mini 类。
        • 第二个是继承关系,名为Is-a。 Mini 类是 Maxi 类的子类,Maxi 是 Mini 类的子类。扩展类 Maxi 时,新类继承 Mini 类的所有字段(受保护或公共数据和方法)。

        【讨论】:

          【解决方案5】:

          “is-a”和“has-a”之间的区别非常重要和关键。如果您不确定“is-a”关系,请不要使用继承。因此,如果您知道概念上 B 不是 A,则不要对 B 使用继承。此外,如果您想从一个类继承只是为了重用某些功能,请永远不要这样做 - 使用“has-a”组合/聚合技术.

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-03-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多