OOPJava:更好地扩展类或创建子类的新实例?

OOP Java: Better to extend a class or create a new instance of the subclass?

本问题已经有最佳答案,请猛点这里访问。

我很难理解面向对象编程的概念。扩展类或在类中创建新对象是否更好?在什么情况下,您会扩展子类而不是在调用类中创建该子类的新实例?这个例子是在Java中,但是我想象这些概念将在其他OOP语言中工作。

我欣赏你的见解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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就是AnimalCat不是CatFood而是可能使用CatFood

在你的例子中,我不知道MiniMaxi是什么,但听起来不像MaxiMini,而是用一个。

一般来说,尝试使用构造函数(使用对象)继承,特别是在Java之类的单继承语言中。


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


"IS-A"和"HAS-A"之间的区别非常重要和关键。如果你不确定"is-a"关系,就不要使用继承。因此,如果您知道概念上b不是a,那么不要对b使用继承。另外,如果您试图从类继承只是为了重用某些功能,那么永远不要使用"has-a"组合/聚合技术。


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

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

目标是保存复制。你需要更多地了解你的用例才能确定。

只有当您有多个扩展顶级类并使用其功能和变量时,我才会真正继承它。如果您只是使用方法签名,那么通常最好使用接口。