6

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

5 回答 5

4

当它有is-a关系时,你扩展一个类。例如,aCatAnimal. ACat不是 aCatFood但它可能使用 CatFood.

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

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

于 2013-10-28T18:05:56.623 回答
1

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

于 2013-10-28T18:07:51.073 回答
0

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

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

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

于 2013-10-28T18:08:21.400 回答
0

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

于 2013-10-28T19:00:38.037 回答
0
  • 第一种情况是聚合关系,名为 has-a。Maxi 类有一个属性,其类型为 Mini 类。
  • 第二个是继承关系,命名为 Is-a。Mini 类是 Maxi 类的子类,Maxi 是 Mini 类的子类。扩展类 Maxi 时,新类继承 Mini 类的所有字段(受保护或公共数据和方法)。
于 2013-10-28T18:19:13.443 回答