- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
给定代码:
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/
我是一名优秀的程序员,十分优秀!