Java面向对象编程:继承一个类还是创建子类的新实例更好?

6
我对面向对象编程的概念感到困惑。 在一个类中,扩展一个类或创建一个新对象哪个更好? 在什么情况下会扩展子类而不是在调用类中创建该子类的新实例?示例是在Java中,但我想这些概念也适用于其他面向对象编程语言。
我感谢您的见解。
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上提问。请参阅:http://blog.stackoverflow.com/2010/09/good-subjective-bad-subjective/ - BlackVegetable
1
根据经验法则:如果你可以轻松地实现目标而不创建子类,那么就不应该创建子类,除非存在明显的“x是y”的关系。 - Holger
不要写愚蠢的代码...学习另一种或两种编程语言。Java有其局限性,所以总是“以Java思考”并不酷。 - Display Name
这取决于你想要实现什么,例如:如果你有一个名为 Car 的类和两个子类 MercedesBMW,你应该继承,因为你需要在两个子类中使用超类的方法。但是,如果这些类没有像我的例子那样的关系,你可以像你所做的那样简单地编写代码:class Maxi { Mini myMini = new Mini(5); ... - Leviathan
1
@luke:不要。在大多数情况下,将“梅赛德斯”和“宝马”作为汽车品牌的实例就足够了。它们并没有为汽车的概念增加任何新内容。这就像是将“红色汽车”和“蓝色汽车”作为“汽车”的子类一样。不要这样做。 - Holger
显示剩余4条评论
5个回答

4
当一个类存在"is-a"的关系时,你可以通过继承来扩展它。例如,一只猫是一种动物,猫不是猫粮但可能会使用猫粮。
就你的情况而言,我不确定MiniMaxi是什么,但听起来Maxi不是Mini,而是使用Mini。
总体而言,在单继承语言(如Java)中,尽量优先使用组合(使用对象)而不是继承。

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

0

首先,你应该问自己的一个问题是:这个类还有哪些其他用途?在子类中,你是否仍需要这个类的功能?你是否会有更多的类也继承 mini?

目标是为了避免重复。你需要更多地了解你的使用情况才能确定。

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


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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接