Tim*_*Tim 5 polymorphism programming-languages
来自编程语言:原则和范例,由Maurizio Gabbrielli,Simone Martini编写
定义8.5一个类型系统,其中同一个对象可以有多个类型,据说是多态的.
通过类比,我们会说当类型系统为其分配多种类型时,该对象是多态的.
当一个对象是多态的时,假设它被分配了类型T1并且类型为T2.T1和T2这两种类型中的一种是另一种的子集吗?(请注意,如果您认为不是这样,您可以通过提供反例来反驳它.)
如果是真的,那么我们可以说多态性发生在超过对象级别的类型级别,在某种意义上,假设T1是T2的子集,T1的任何对象也可以被分配T2?
如果不是这样,那么我们可以说多态性只发生在对象级别而不是类型级别,在某种意义上,T1的另一个对象可能没有被分配T2,而T2的另一个对象可能不是分配T1?
谢谢.
例子
如果类型 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.
...
Run Code Online (Sandbox Code Playgroud)
所以这个例子中的对象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();
}
};
Run Code Online (Sandbox Code Playgroud)
这里每个可以是 T3 的对象也可以是 T1 和 T2。T1和T3、T2和T3之间存在子集包含关系,但T1和T2之间不存在子集包含关系。所以在我看来,这似乎是你的一般性陈述的一个很好的反例。
其他考虑因素
您不能假装多态性仅发生在对象级别。至少在强类型系统和您给出的定义中不是这样。
然而,对象是多态性的基石。例如,在 C++ 中,根据您的定义,您可以拥有多态类型,其行为就好像它们只有一种类型,具体取决于它们的上下文和引用它们的类型:只需从virtual上面的 C++ 示例中删除关键字即可看看会发生什么。