Polymorphism 编程语言中的多态性是否意味着所涉及类型之间的子集关系?

Polymorphism 编程语言中的多态性是否意味着所涉及类型之间的子集关系?,polymorphism,programming-languages,Polymorphism,Programming Languages,从 定义8.5一种类型系统,其中同一对象可以具有更多 据说不止一种类型是多态的 通过类比,当类型为 系统为其指定多个类型 当一个对象是多态的时,假设它被分配了类型T1和类型T2。T1和T2两种类型中的一种是另一种类型的子集,这总是真的吗?(请注意,如果您认为这不是真的,您可以通过给出反例来反驳。) 如果这是真的,那么我们能说多态性发生在类型的层次上,而不是对象的层次上,在这个意义上,假设T1是T2的子集,T1的任何对象也可以被分配T2吗 如果这不是真的,那么我们可以说多态性只发生在对象的层次上,

定义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.  
...

因此,本例中的对象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();
    }
};
T1类{
公众:
虚空f(){

cout
类Foo实现Interface1,Interface2{}
。因为这是语言不可知的(至少我认为应该是这样),所以最好将其发布在Programmer.SE上在你引用的段落中的用法与在主要问题中的用法非常不同。@Tim:这是你的问题:-s引用的段落是用类型理论的技术语言写的(如果你愿意,这是数学的一部分),并且必须在这种背景下理解。从类型理论到具体的编程语言还有很长的路要走。每种编程语言都有自己的词汇表,其中一些术语可能看起来很熟悉,但含义不同。@NathanOliver甚至可能是CompSci。