2016-08-29 6 views
5

От Programming Languages: Principles and Paradigms, by Maurizio Gabbrielli, Simone MartiniПолиморфизм в языках программирования подразумевает подмножество отношений между задействованными типами?

De определению 8.5 Тип системы, в которой тот же объект может иметь более чем один тип называется полиморфными.

По аналогии, мы будем говорить, что объект является полиморфным, когда система типа присваивает ему более одного типа.

Когда объект является полиморфным, предположим, что ему назначен тип T1 и тип T2. Всегда ли верно, что один из двух типов T1 и T2 является подмножеством другого? (Обратите внимание: если вы считаете, что это неверно, вы можете опровергнуть его, указав контрпример.)

Если это правда, то можем ли мы сказать, что полиморфизм происходит на уровне типов, который больше, чем на уровне объекты, в том смысле, что предполагаемый T1 является подмножеством T2, любому объекту T1 также может быть назначен T2?

Если это не так, то можем ли мы сказать, что полиморфизм происходит только на уровне объектов, а не уровня типов, в том смысле, что другому объекту T1 не может быть назначен T2, а другой объект T2 может не назначаться T1?

Спасибо.

+3

'class Foo реализует Interface1, Interface2 {}'. –

+3

Поскольку это язык агностик (по крайней мере, я думаю, это должно быть), возможно, лучше опубликовать его на Programmer.SE. – NathanOliver

+0

Я думаю, что это правда, но я не могу понять, почему я это делаю. Это просто имеет смысл для меня. (Конечно, возможно, возможно злоупотреблять системой типов, но наследование, похоже, предназначено для отображения отношений типа подмножества). –

ответ

3

Пример

Если каждый объект типа Т2 также типа Т1, Т2, то является подтипом 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. 
... 

Online demo

Так объект О в данном примере имеет два типа: 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 будет также T1 и T2, а также. Существует взаимосвязь включения подмножества между T1 и T3 и T2 и T3, но не между T1 и T2. Так что это мне кажется хорошим контр-примером вашего общего заявления.

Live C++ example

Другие соображения

Вы не можете делать вид, что полиморфизм происходит только на уровне объектов. По крайней мере, не в строго типизированных системах и с определениями, которые вы указали.

Объект является краеугольным камнем для полиморфизма.Например, в C++ у вас могут быть полиморфные типы в соответствии с вашим определением, которые будут вести себя так, как если бы они имели только один тип в зависимости от их контекста и типа, с которым они ссылаются: просто удалите ключевое слово virtual из примера C++ выше, чтобы узнать, что произойдет.