答案 0 :(得分:3)
有is-a
和has-a
,它们的含义正是您所期望的。
Has-a
表示中包含其他类型的类型。 Is-a
表示从其他类型派生的类型。
回到我们在开始研究面向对象概念时首先考察的简单例子,一辆汽车is-a
车辆,但has-a
方向盘。
或者,作为替代方案,请考虑以下类层次结构:
shape:
coordinate c
square: shape
size s
这里,正方形继承了形状的所有内容,因此是形状。但是,正方形的 size 不是层次结构的一部分,因此正方形具有-a 大小。
答案 1 :(得分:2)
继承(IS-A) 考虑覆盖,扩展/隐藏基类功能。
聚合(HAS-A) 想拿着指向对象的指针,而不是控制它的一生。
成分(更强的HAS-A) 想拿着堆栈分配的对象,RAII等。
在维基百科上可以找到很好的介绍性阅读:
答案 2 :(得分:1)
IS-A用于描述派生对象和基础对象之间的关系。派生对象通常是基础对象的专用版本,因此您可以说 派生对象是基础对象
请参阅此简单示例, circle 专门设置形状基类。
struct shape
{
virtual int area() = 0;
};
struct circle : shape // circle is a shape
{
};
答案 3 :(得分:1)
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
还有哪些其他类型的关系?
大多数人在is-a
旁边引用has-a
关系,这意味着对象可能具有特定属性或属性,但不一定由这些特征定义。
例如,Dog
有一个名称,一个重量,四条腿等等,但这不一定是什么使它成为一只狗。