2016-08-29 36 views
5

Z Programming Languages: Principles and Paradigms, by Maurizio Gabbrielli, Simone MartiniCzy polimorfizm w językach programowania implikuje zależność między podzbiorem powiązanych typów?

De Definition 8,5 systemie typu, w którym ten sam obiekt może mieć więcej niż jeden rodzaj mówi się polimorficzne.

Analogicznie powiemy, że obiekt jest polimorficzny, gdy system typu przypisuje mu więcej niż jeden typ.

Gdy obiekt jest polimorficzny, należy założyć, że przypisano mu typ T1 i typ T2. Czy zawsze jest prawdą, że jeden z dwóch typów T1 i T2 jest podzbiorem drugiego? (Zauważ, że jeśli uważasz, że to nieprawda, możesz je obalić, podając kontrprzykład.)

Jeśli to prawda, to możemy powiedzieć, że polimorfizm zachodzi na poziomie typów, który jest większy niż na poziomie obiekty, w tym sensie, że przypuszczalnie T1 jest podzbiorem T2, dowolny obiekt T1 może być również przypisany T2?

Jeśli nie jest to prawda, to możemy powiedzieć, że polimorfizm zachodzi tylko na poziomie obiektów, a nie na poziomie typów, w tym sensie, że inny obiekt T1 może nie być przypisany T2, a inny obiekt T2 może nie być przypisany T1?

Dzięki.

+3

'class Foo implementuje interfejs1, interfejs2 {}'. –

+3

Ponieważ jest to agnostykiem językowym (przynajmniej uważam, że tak powinno być), lepiej byłoby opublikować to na stronie Programmer.SE. – NathanOliver

+0

Myślę, że to prawda, ale nie mogę zrozumieć, dlaczego tak robię. To po prostu ma sens. (Oczywiście możliwe jest nadużywanie systemu typu, ale wydaje się, że dziedziczenie ma na celu pokazywanie relacji typu podzestawu). –

Odpowiedz

3

Przykład

Jeżeli każdy obiekt typu T2 jest typu T1, T2, a następnie jest podtypem T1. Oznacza to zazwyczaj, że T2 dziedziczy z T1. Tutaj java przykład:

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

Więc obiekt O w tym przykładzie ma dwa typy: T2 i T1 dziedziczone. Jego zachowanie jest definitywnie polimorficzne.

Kontrprzykład: nie jest to powszechność

Obiekt może kilka typów niekoniecznie jeden rodzaj jest podtypem drugiego. Zazwyczaj można mieć wielokrotne dziedziczenie, jak w tym przykładzie 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(); 
    } 
}; 

Tutaj każdy przedmiot o który byłby T3 byłoby również T1 i T2, jak również. Istnieje zależność między podzbiorami między T1 i T3 oraz T2 i T3, ale nie między T1 i T2. To wydaje mi się dobrym kontr-przykładem twojego ogólnego stwierdzenia.

Live C++ example

Inne względy

Nie można udawać, że polimorfizm zdarza się tylko na poziomie obiektów. Przynajmniej nie w mocno napisanych systemach i definicjach, które podałeś.

Obiekt jest jednak kamieniem węgielnym dla polimorfizmu.Na przykład w C++ możesz mieć typy polimorficzne zgodnie z twoją definicją, które zachowują się tak, jakby miały tylko jeden typ w zależności od kontekstu i typu, do którego są skierowane: po prostu usuń słowo kluczowe virtual z przykładu C++ powyżej, aby zobaczyć, co się dzieje.