【发布时间】:2023-04-10 15:42:02
【问题描述】:
【问题讨论】:
-
你的第一个想法是在这里问一个过于宽泛的问题而不是尝试谷歌?
-
“其他类型的关系”:“has-a”和“is-implemented-in-terms-of”,前者表示“组合”,后者相当于“私有继承”。这个问题太笼统了,google一下吧。
标签: c++ polymorphism
【问题讨论】:
标签: c++ polymorphism
有is-a 和has-a,它们的意思正是你所期望的。
Has-a 表示其中包含另一个类型的类型。 Is-a 表示从另一个类型派生的类型。
回到我们开始研究面向对象概念时首先检查的简单示例,汽车is-a 车辆,但它是has-a 方向盘。
或者,作为替代方案,请考虑以下类层次结构:
shape:
coordinate c
square: shape
size s
在这里,正方形继承了形状的所有内容,因此它是一个形状。但是,正方形的 size 不是层次结构的一部分,因此正方形 has-a 大小。
【讨论】:
继承 (IS-A) 考虑覆盖、扩展/隐藏基类功能。
聚合 (HAS-A) 想想持有一个指向对象的指针而不是控制它的生命周期。
作曲(强 HAS-A) 想想持有一个堆栈分配的对象,RAII 等。
可以在 Wikipedia 上找到好的入门读物:
【讨论】:
IS-A 用于描述派生对象和基础对象之间的关系。派生对象通常是基础对象的特殊版本,因此您可以说派生对象是基础对象
看这个简单的例子,一个 circle 特化了一个 shape 基类。
struct shape
{
virtual int area() = 0;
};
struct circle : shape // circle is a shape
{
};
【讨论】:
IS-A 关系在这里是什么意思?
这意味着从某个基类型派生的所有对象实际上都是该基类型的对象,即使它们在您的程序中被它们的实际类型引用。
以这个(Java)为例:
class Animal {
public void move(){
System.out.println("Animals can move");
}
}
class Dog extends Animal {
public void move() {
System.out.println("Dogs can walk and run");
}
}
如果你要参加以下测试:
public class TestDog {
public static void main(String args[]) {
Animal a = new Animal(); // Animal reference and object
Animal b = new Dog(); // Animal reference but Dog object
a.move();//output: Animals can move
b.move();//output:Dogs can walk and run
}
}
你会看到这个程序中的两个对象是动物,尽管其中一个实际上是狗。 Animal 对象引用可用于引用从Animal 派生的任何对象,因此is a 关系。 Dog 是 Animal。
有关此示例参考,请参阅 this post
还有哪些其他类型的关系?
大多数人在提到has-a 旁边提到is-a 关系,这意味着一个对象可能具有特定的属性或属性,但不一定由这些特征定义。
例如,Dog有一个名字、体重、四条腿等,但这并不一定是它成为狗的原因。
【讨论】: