gpt4 book ai didi

java - Has-A 关系适用于继承的成员吗?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:29:20 26 4
gpt4 key购买 nike

给定代码:

class Car{
Engine engine;
}

class SportCar extends Car{
SportChair chair;
}

说“SportCar “有一个”引擎和一个 SportChair”是否有效?
或者唯一有效的肯定是:'SportCar "has-a" SportChair' 和 'Car "has-a" Engine'?

最佳答案

我对此没有任何明确的来源,但我的直觉是这种关系确实适用于继承的成员。

在您的示例中,SportCar“是一种”汽车,因此它“具有”引擎。

这可能与 Liskov Substitution Principle 有关,其中父类(super class)型应该可以被其任何子类型替换。在这种情况下,父类(super class)型“有一个”引擎,为了让子类型遵循 LSP,它们必须认识到它们也有一个引擎。

这不仅应该遵循类的成员,还应该遵循一般的行为和状态 - 一个类不应该从另一个继承,除非它对继承的每个方面都有意义。 IE。在你的例子中,如果 Car 有一个方法“attachBabySeat()”,那么 SportsCar 从它继承就没有意义。同样,成员 protected BabySeat[] babySeats 对 SportsCar 没有意义。

在 Java 中,异常(exception)情况是 private 或“package-private”(也称为默认)成员变量。这些通常是不属于抽象的实现细节。子类无法访问这些字段,因此我不会将私有(private)成员视为子类“拥有”关系的一部分。

在 Java 语言中,创建子类时,也构造了父类(super class)(隐式或显式)。因此,当父类(super class)具有私有(private)成员时,就内存、JVM 等而言,这仍然是子类对象的一部分。例如,父类(super class)上使用私有(private)成员的方法可以毫无问题地从子类中调用。因此,在某种程度上,您可能会争辩说子类确实“拥有”父类(super class)的私有(private)字段,但我认为这是物理层面的,而不是概念层面的,可以忽略不计。

关于java - Has-A 关系适用于继承的成员吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1898054/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com