来自Programming Languages: Principles and Paradigms, by Maurizio Gabbrielli, Simone Martini
定义8.5一种类型系统,其中同一个对象可以有更多 据说只有一种类型是多态的。
通过类比,我们会说该对象在类型时是多态的 系统为其分配了多种类型。
当一个对象是多态的时,假设它被分配了类型T1并且类型为T2。 T1和T2这两种类型中的一种是另一种的子集吗? (请注意,如果您认为不正确,可以通过提供反例来反驳它。)
如果确实如此,那么我们可以说多态性发生在超过对象级别的类型级别,在某种意义上,假设T1是T2的子集,T1的任何对象也可以是分配T2?
如果不是这样,那么我们可以说多态性只发生在对象层面而不是类型层面,在某种意义上,T1的另一个对象可能没有被分配T2,而另一个对象是T2可能没有分配T1?
感谢。
答案 0 :(得分:3)
示例强>
如果T2类型的每个对象也是T1类型,则T2是T1的子类型。这通常意味着T2继承自T1。这是一个java示例:
class T1
{
public void f() {
System.out.println ("hello I'm f() in T1");
}
}
class T2 extends T1
{
public void f() {
System.out.println ("hello I'm f() in T2");
}
}
...
T1 o = new T2();
o.f(); // behavior depends if o refers to a T1 or a T2.
...
因此,此示例中的对象o有两种类型:T2和继承的T1。它的行为绝对是多态的。
反例:这不是一般性
对象可以有多种类型,但不一定是一种类型是另一种类型的子类型。通常,您可以拥有多个继承,如此C ++示例中所示:
class T1 {
public:
virtual void f() {
cout<<"I'm f() from T1"<<endl;
}
};
class T2 {
public:
virtual void f() {
cout<<"I'm f() from T2"<<endl;
}
virtual void g() {
cout<<"I'm g() from T2"<<endl;
}
};
class T3 : public T1, public T2 {
public:
void f() {
T2::f();
T1::f();
}
};
这里作为T3的每个o对象也将是T1和T2。 T1和T3以及T2和T3之间存在子集包含关系,但T1和T2之间不存在。所以在我看来,这是你的一般性陈述的一个很好的反例。
其他注意事项
您不能假装多态性仅在对象级别发生。至少不是强类型系统和你给出的定义。
然而,该对象是多态性的基石。例如,在C ++中,您可以根据您的定义使用多态类型,其行为就好像它们只有一种类型,具体取决于它们的上下文和引用它们的类型:只需删除virtual
关键字从上面的C ++示例中看看会发生什么。