2016-08-29 13 views
5

Từ Programming Languages: Principles and Paradigms, by Maurizio Gabbrielli, Simone MartiniTính đa hình trong ngôn ngữ lập trình có ngụ ý mối quan hệ tập hợp con giữa các loại có liên quan không?

De fi định nghĩa 8.5 Một hệ thống kiểu trong đó cùng một đối tượng có thể có nhiều hơn một loại được gọi là đa hình.

Tương tự, chúng tôi sẽ nói rằng đối tượng là đa hình khi hệ thống loại gán nhiều loại cho nó.

Khi đối tượng đa hình, giả sử rằng nó được gán loại T1 và loại T2. Có luôn luôn là một trong hai loại T1 và T2 là tập hợp con của loại kia? (Lưu ý rằng nếu bạn cho rằng đó không phải là sự thật, bạn có thể từ chối nó bằng cách đưa ra một ví dụ.)

Nếu đúng, thì chúng ta có thể nói rằng đa hình xảy ra ở mức độ nhiều hơn mức các đối tượng, theo nghĩa, T1 là một tập con của T2, bất kỳ đối tượng T1 nào cũng có thể được gán T2?

Nếu không đúng, thì chúng ta có thể nói rằng đa hình chỉ xảy ra ở cấp độ đối tượng, thay vì mức độ loại, theo nghĩa, một đối tượng T1 khác có thể không được gán T2 và đối tượng khác T2 có thể không được gán T1?

Cảm ơn.

+3

'lớp Foo triển khai Interface1, Interface2 {}'. –

+3

Vì đây là ngôn ngữ bất khả tri (ít nhất là tôi nghĩ nó nên được) nó có thể là tốt hơn để đăng này trên Programmer.SE. – NathanOliver

+0

Tôi nghĩ đó là sự thật, nhưng tôi không thể hiểu tại sao tôi lại làm vậy. Nó chỉ có ý nghĩa với tôi. (Tất nhiên, có thể lạm dụng hệ thống kiểu, nhưng thừa kế có vẻ được thiết kế để hiển thị các mối quan hệ kiểu con) –

Trả lời

3

Ví dụ

Nếu mỗi đối tượng của loại T2 cũng loại T1, sau đó T2 là một subtype của T1. Điều này có nghĩa là T2 thừa kế từ T1. Dưới đây là một ví dụ 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

Vì vậy, đối tượng o trong ví dụ này có hai loại: T2 và T1 thừa hưởng. Hành vi của nó là hoàn toàn đa hình.

Counter-ví dụ: đây không phải là một tổng quát

Một đối tượng có thể có một số loại mà không nhất thiết một loại là một subtype của người khác. Thông thường, bạn có thể có nhiều thừa kế, như trong ví dụ C++ này:

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(); 
    } 
}; 

Ở đây mọi đối tượng sẽ là T3 cũng sẽ là T1 và T2. Có một mối quan hệ bao gồm tập hợp con giữa T1 và T3 và T2 và T3 nhưng không phải giữa T1 và T2. Vì vậy, điều này dường như với tôi một ví dụ phản đối tốt về tuyên bố chung của bạn.

Live C++ example

cân nhắc khác

Bạn không thể giả vờ polymorphism điều đó xảy ra chỉ ở mức độ của các đối tượng. Ít nhất không phải trong các hệ thống đánh máy mạnh mẽ và với các định nghĩa mà bạn đã đưa ra.

Đối tượng là nền tảng cho đa hình.Ví dụ, trong C++ bạn có thể có các loại đa hình theo định nghĩa của bạn, nó sẽ hoạt động như thể chúng chỉ có một kiểu tùy thuộc vào ngữ cảnh của chúng và kiểu mà chúng được gọi: chỉ cần loại bỏ từ khóa virtual từ ví dụ C++ ở trên để xem điều gì xảy ra.

Các vấn đề liên quan