OOP Java:扩展类或创建子类的新实例更好吗?

OOP Java:扩展类或创建子类的新实例更好吗?,java,oop,Java,Oop,我在面向对象编程的概念方面遇到了问题。 扩展类还是在类中创建新对象更好? 在什么情况下,您会扩展一个子类,而不是在调用类中创建该子类的新实例?这个例子是用Java编写的,但我想这些概念在其他OOP语言中也可以使用 我欣赏你的见解 class Mini { // I want to use the members of this class in another class int myInt; public Mini(int myInt){ this.myInt

我在面向对象编程的概念方面遇到了问题。 扩展类还是在类中创建新对象更好? 在什么情况下,您会扩展一个子类,而不是在调用类中创建该子类的新实例?这个例子是用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);
    }
}

当类具有
is-a
关系时,可以对其进行扩展。例如,猫是一种动物。
Cat
不是
CatFood
,但它可能使用
CatFood

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


一般来说,试着支持组合(使用对象)而不是继承,特别是在java这样的单继承语言中。

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

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

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

只有在扩展顶级类并使用其功能和变量时,我才会真正继承。如果只是用于方法,则签名接口通常是更好的选择。

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

区分“is-a”和“has-a”是非常重要和关键的。如果您不确定“is-a”关系,请不要使用继承。因此,如果您知道概念上B不是A,那么不要对B使用继承。同样,如果您试图从类继承只是为了重用某些功能,也不要这样做——使用“has-A”组合/聚合技术。

这个问题似乎倾向于鼓励更多基于意见的答案,而不是严格客观的答案。通常,这样的问题不适合堆栈溢出。请参阅:经验法则:如果不创建子类就可以轻松实现目标,那么就不应该创建子类。除非存在明显的“x是y”关系,否则它们是两个完全不同的东西。扩展您创建的“is a”关系的类,即Maxi是Mini的一种类型。如果你在Maxi中实例化一个Mnin,那么它是一个“包含”关系…@luke:不。在大多数情况下,将“梅赛德斯”和“宝马”作为汽车品牌的实例就足够了。他们没有给汽车的概念增添新的东西。这与生成“Car”的“RedCar”和“BlueCar”子类是一样的。不要这样做。