Tính đa hình - Định nghĩa chỉ trong hai câu [đóng]


85

Tôi đã xem xét các định nghĩa và giải thích khác và không có cách nào trong số chúng làm tôi hài lòng. Tôi muốn xem liệu có ai có thể định nghĩa đa hình trong nhiều nhất hai câu mà không cần sử dụng bất kỳ mã hoặc ví dụ nào không. Tôi không muốn nghe 'Vì vậy, bạn có một người / ô tô / đồ khui hộp ...' hoặc cách bắt nguồn từ này (không ai ấn tượng rằng bạn biết poly và morph nghĩa là gì). Nếu bạn hiểu rất rõ về đa hình là gì và có vốn tiếng Anh tốt thì bạn sẽ có thể trả lời câu hỏi này trong một định nghĩa ngắn gọn, mặc dù dày đặc. Nếu định nghĩa của bạn xác định chính xác tính đa hình nhưng quá dày đặc đến mức cần phải đọc một vài lần thì đó chính xác là điều tôi đang tìm kiếm.

Tại sao chỉ có hai câu? Bởi vì một định nghĩa là ngắn gọn và thông minh. Một giải thích dài và chứa các ví dụ và mã. Hãy xem ở đây để giải thích (câu trả lời trên những trang đó không thỏa đáng cho câu hỏi của tôi):

Đa hình so với Ghi đè so với Quá tải
Cố gắng mô tả tính đa hình dễ dàng nhất có thể

Tại sao tôi hỏi câu hỏi này? Bởi vì tôi đã được hỏi cùng một câu hỏi và tôi thấy mình không thể đưa ra một định nghĩa thỏa đáng (theo tiêu chuẩn của tôi là khá cao). Tôi muốn xem liệu có bộ óc vĩ đại nào trên trang web này có thể làm được không.

Nếu bạn thực sự không thể thực hiện được yêu cầu hai câu (đây là một chủ đề khó xác định) thì bạn có thể vượt qua. Ý tưởng là có một định nghĩa thực sự xác định tính đa hình là gì và không giải thích chức năng của nó hoặc cách sử dụng nó (có được sự khác biệt?).


Một tên, nhiều triển khai.
Prosunjit Biswas

2
Tôi đã hỏi câu hỏi này trong một cuộc phỏng vấn việc làm. Tôi cảm thấy việc hỏi nó trong một cuộc phỏng vấn xin việc là một hành động hợm hĩnh, kiểu một nhân viên của Google sẽ hỏi một cách tự mãn giả sử rằng không ai có thể trả lời nó một cách hiệu quả. Nếu bạn không nhận được công việc vì bạn không thể trả lời, có lẽ bạn nên làm việc cho những người quan tâm đến những gì bạn có thể làm hơn là những người bạn có thể vượt qua.
MagicLAMP

Đa hình là một khái niệm rất quan trọng cần hiểu trong quá trình phát triển. Tôi thực sự khuyên bạn nên hiểu ít nhất giá trị của nó nếu không phải là định nghĩa chính thức. Tôi đề nghị ít nhất có thể giải thích cách hoạt động của mẫu Chiến lược và giá trị của nó.
Chad Johnson

Câu trả lời:


106

Tính đa hình cho phép thể hiện một số loại hợp đồng, với nhiều loại tiềm năng thực hiện hợp đồng đó (cho dù thông qua kế thừa lớp hay không) theo những cách khác nhau, mỗi loại theo mục đích riêng của chúng. Quy tắc sử dụng hợp đồng đó không nên (*) phải quan tâm đến việc thực hiện nào có liên quan, chỉ rằng hợp đồng sẽ được tuân theo.

(*) Dù sao thì trong trường hợp lý tưởng - rõ ràng là mã gọi điện đã chọn cách triển khai thích hợp rất có chủ ý!


1
Mark, có lúc nào bạn chấp nhận câu trả lời này và sau đó không chấp nhận nó không? Tôi đang cố gắng tìm ra lỗi nào trong hệ thống danh tiếng - câu trả lời này đã mang lại cho tôi tổng cộng -15 đại diện cho ngày hôm nay, thật kỳ lạ.
Jon Skeet

Tương tự ở đây, Jon - Tôi hiện có 2 câu trả lời được chấp nhận với -15 đại diện. Không phải tôi quan tâm nhưng nó là hấp dẫn.
Otávio Décio

3
Nói một cách chính xác, không có yêu cầu rằng "một kiểu thể hiện một số loại hợp đồng". Tất cả những gì thực sự cần thiết là nhiều triển khai có thể trả lời cùng một thông báo mà người gửi thông báo không cần biết hoặc quan tâm đến việc triển khai nào đang xử lý thông báo.
Doug Knesek

3
@Doug: Nếu không có hợp đồng, thậm chí được ngụ ý thông qua tài liệu hoặc tên, thì làm sao bạn biết nó sẽ làm những gì bạn muốn? Bạn nói về một "giao diện" trong câu trả lời của riêng bạn - nghe có vẻ giống như một hợp đồng đối với tôi - bạn thấy sự khác biệt là gì? Cả "giao diện" và "hợp đồng" đều là những từ có thể được sử dụng theo nghĩa "mạnh mẽ" (ví dụ: được thực thi tại thời điểm biên dịch) hoặc rất lỏng lẻo (ví dụ: theo quy ước đặt tên và sử dụng kiểu gõ động).
Jon Skeet

1
@Alex: Vâng, đó sẽ là một bản chỉnh sửa mà tôi sẽ hoàn nguyên - tôi thích cách diễn đạt của mình hơn. Bạn luôn có thể thêm câu trả lời của riêng mình.
Jon Skeet

72

Trái cây có thể được ăn, theo nguyên tắc chung, nhưng các loại trái cây khác nhau được ăn theo những cách khác nhau. Quả táo là một loại quả có thể ăn được (vì nó là quả). Một quả chuối cũng có thể được ăn (vì nó cũng là một loại trái cây), nhưng theo cách khác với quả táo. Bạn gọt vỏ trước.

Chà, ít ra thì tôi cũng vậy, nhưng tôi cũng lạ ở một số cách cư xử nên tôi biết làm sao.

Điều này minh họa tính kế thừa (trái cây có thể ăn được), tính đa hình (thứ ăn trái cây có thể ăn tất cả các loại trái cây), và tính bao bọc (quả chuối có vỏ).

Nghiêm túc mà nói, kế thừa đối tượng, tính đa hình, tính đóng gói, thứ ảo, thứ trừu tượng, thứ riêng tư, thứ công khai, đây đều là những khái niệm khó. Nếu ai đó thực sự muốn có định nghĩa 2 câu về điều này thì hãy gắn thẻ câu hỏi dưới dạng biến thể mã-gôn, bởi vì hai câu như vậy sẽ phải ngắn gọn đến mức trừ khi bạn biết nó là gì thì bạn sẽ không học đủ. nó để biết những gì bạn cần tìm hiểu thêm.


lassevk: "trừ khi bạn biết nó là gì, bạn sẽ không học đủ về nó để biết những gì bạn cần tìm hiểu thêm về" << Chỉ để làm rõ, đó là những gì tôi đang mong đợi. Tôi đang tìm kiếm một định nghĩa có thể cần một chút suy nghĩ để hiểu. Không phải là một cái sẽ được sử dụng để dạy một người mới bắt đầu.
Đánh dấu Testa

2
Tôi thu thập được điều đó, tôi chỉ đăng một câu trả lời hơi hài hước (đối với tôi) :) Đa hình và OOP là một trong những bức tường lớn đó, nơi nếu bạn vẽ đồ thị đường cong học tập, bạn chỉ cần chạm vào một bức tường lớn và hoặc bạn bò qua nó , hoặc bạn không. Nếu bạn làm vậy, thì bạn thường có một lượng lớn AHA! kinh nghiệm ...
Lasse V. Karlsen

8
Hemlock cũng là một loại trái cây! Bạn có thể ăn nó nhưng chỉ một lần!
James Anderson

@JamesAnderson Vì vậy, một singleton?
Lasse V. Karlsen

47

Đa hình là khai báo một giao diện thống nhất không nhận dạng được kiểu, để lại chi tiết triển khai cho các kiểu cụ thể triển khai giao diện.


Đây là kinh ngạc ngắn gọn và tôi nghĩ rằng nó phù hợp một cách hoàn hảo
Alex W

21

Wikipedia: Tính đa hình là một tính năng của ngôn ngữ lập trình cho phép các giá trị của các kiểu dữ liệu khác nhau được xử lý bằng một giao diện thống nhất. Khá đơn giản đối với tôi.


21

Trên thực tế, có nhiều dạng đa hình và có khá nhiều tranh cãi về nó; bạn thậm chí có thể thấy các giáo sư CS không thể định nghĩa nó một cách chính xác. Tôi biết ba loại:

  • tính đa hình ad-hoc (trông giống vịt và đi như vịt => là vịt). Có thể thấy trong Haskell và Python chẳng hạn.

  • đa hình chung chung (trong đó một kiểu là một thể hiện của một số kiểu chung). Có thể thấy trong C ++ chẳng hạn (vector của int và vector của chuỗi đều có kích thước hàm thành viên).

  • đa hình kiểu con (trong đó một kiểu kế thừa từ kiểu khác). Có thể thấy ở hầu hết các ngôn ngữ lập trình OO (tức là Tam giác là Hình dạng).


2
+1 vì đã đề cập rằng có nhiều loại đa hình khác nhau. Tuy nhiên, định nghĩa của bạn về tính đa hình ad-hoc dường như khá khác với định nghĩa được đề cập tại en.wikipedia.org/wiki/Type_polymorphism . Trang đó nói rằng có 2 loại (đặc biệt so với tham số), không phải 3, và cũng phân biệt giữa các hàm đa hình và các kiểu dữ liệu đa hình. 3 kiểu của bạn, theo như tôi có thể xác định tương ứng với các hàm đa hình tham số, các kiểu dữ liệu đa hình tham số và các hàm đa hình ad-hoc, tương ứng.
Laurence Gonsalves

chào, sự khác biệt giữa "trường hợp của một số loại chung" và "kế thừa từ một loại khác" những điều này dường như nói cùng một điều?
Shanimal 29/07/18

@LaurenceGonsalves fwiw, liên kết được cung cấp trong nhận xét đầu tiên chỉ ra ba loại. Tính đa hình tham số được định nghĩa là cho phép một hàm hoặc một kiểu dữ liệu được viết "chung chung".
Shanimal 29/07/18

14

Tôi thực sự hiểu, tại sao bạn lại hỏi câu hỏi này. Tôi hiểu tính đa hình, nhưng tôi đã tham gia một cuộc phỏng vấn việc làm và được yêu cầu đưa ra định nghĩa ngắn gọn và rõ ràng về tính đa hình. Vì tôi không thể đưa ra định nghĩa rõ ràng và ngắn gọn nên tôi bắt đầu suy nghĩ về nó và đây là định nghĩa của tôi:

Khả năng các đối tượng của một kiểu có một và cùng một giao diện, nhưng cách triển khai giao diện này khác nhau.


10

Định nghĩa :

Đa hình là một từ $ 10 cho một ý tưởng $ 1 - khi tôi yêu cầu hoàn thành một việc gì đó, tôi không quan tâm nó đạt được như thế nào miễn là kết quả cuối cùng là phù hợp. Miễn là dịch vụ được cung cấp chính xác, tôi không quan tâm đến việc triển khai .

Thảo luận

Mặc dù nó thường được sử dụng trong phát triển phần mềm, đặc biệt là trong các hệ thống được phát triển theo các nguyên tắc hướng đối tượng, nhưng Đa hình về cơ bản là một nguyên tắc thế giới thực và nên được định nghĩa theo thuật ngữ thế giới thực chứ không phải thuật ngữ công nghệ.

Ví dụ

Khi tôi muốn gọi điện thoại, tôi nhấc máy, bấm một số và nói chuyện với đầu dây bên kia. Tôi không quan tâm đến việc ai đã tạo ra điện thoại, nó sử dụng công nghệ gì, cho dù nó có dây, không dây, di động hay VOIP, hay nó có được bảo hành hay không.

Khi tôi muốn in một tài liệu, tôi sẽ in nó. Tôi không quan tâm đến ngôn ngữ thực hiện, thương hiệu máy in, kiểu kết nối, lựa chọn vật tư tiêu hao hoặc chất lượng giấy.


5
nghe giống như ví dụ của Encapsulationtôi
Singleton

1
Đa hình, Đóng gói và Trừu tượng đều có liên quan khá chặt chẽ với nhau, mặc dù chúng tập trung vào các quan điểm khác nhau. Sự trừu tượng hóa tốt làm cho tính đa hình dễ đạt được hơn, và tính đóng gói tốt giúp ngăn các chi tiết bị "rò rỉ".
Bevan

10

Nhiều triển khai của cùng một giao diện.

Ví dụ: Nhiều kiểu điện thoại thực hiện giao diện bàn phím số.


8

Đa hình là một chiến lược hướng đối tượng được sử dụng khi thiết kế các mô hình đối tượng, để giúp đơn giản hóa mã. Tính đa hình cốt lõi của nó là khả năng xác định hai đối tượng mô phỏng nhưng khác nhau, và sau đó xử lý hai đối tượng như thể chúng giống nhau.

Ok khó quá….


7

Tôi chỉ nghĩ rằng tôi sẽ thêm cách giải thích của riêng mình về tính đa hình là gì: Rất chung chung, đa hình là hành động cung cấp một giao diện duy nhất cho các thực thể thuộc các loại khác nhau .

Điều đó khá chung chung, nhưng đó là cách duy nhất tôi có thể nghĩ ra để bao bọc cả ba loại đa hình mà tôi biết: đặc biệt , tham sốkiểu con . Tôi sẽ đi vào chi tiết hơn bên dưới và đã sắp xếp các loại đa hình theo tên, theo thứ tự bảng chữ cái. Điều bạn quan tâm nhất có lẽ là đa hình kiểu phụ , là kiểu cuối cùng.

Đa hình đặc biệt

Tính đa hình đặc biệt là hành động cung cấp nhiều triển khai của cùng một phương thức cho các kiểu tham số khác nhau. Trong OOP , nó thường được gọi là quá tải phương thức . Ví dụ:

public String format(int a) {
    return String.format("%2d", a);
}

public String format(Date a) {
    return new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'").format(a);
}

Cả hai formatphương pháp đều chia sẻ một giao diện duy nhất , nhưng chúng hoạt động trên các thực thể thuộc các loại khác nhau .

Đa hình tham số

Đa hình tham số là hành động làm cho một lớp (hoặc phương thức) hoạt động trên một kiểu mà bản thân nó là một tham số của lớp (hoặc phương thức). Nó thường được gọi là thuốc chung .

Ví dụ: Java's yêu cầu List[T]một tham số Ttại thời điểm khởi tạo và tham số này xác định kiểu của đối tượng kết quả.

Lưu ý đối với những người theo chủ nghĩa thuần túy rằng tôi cố tình bỏ qua các loại thô vì tôi cảm thấy chúng chỉ làm bùn nước trong bối cảnh này.

List[String]List[Date]chia sẻ một giao diện duy nhất , nhưng hoạt động trên (và là) các loại khác nhau .

Đa hình kiểu phụ

Đa hình kiểu phụ có thể là ý bạn ban đầu trong câu hỏi của mình: Đó là hành động cung cấp một giao diện duy nhất cho nhiều triển khai cùng loại.

Để sử dụng ví dụ thông thường: Animalcung cấp một hợp đồng mà tất cả các triển khai phải tôn trọng. Doglà một Animal, và như vậy hỗ trợ tất cả các hoạt động Animalkhai báo. Theo nguyên tắc thay thế Liskov , điều này cho phép bạn sử dụng một trường hợp Dogmà một trường hợp Animalđược mong đợi (nhưng không phải ngược lại).

Nếu CatDoglà cả hai lớp con của Animal, thì chúng chia sẻ một giao diện duy nhất nhưng trên thực tế là các loại khác nhau .

Ở đây tôi sẽ đi vào một chút tiếp tuyến, nhưng đa hình kiểu con là (tôi nghĩ) là kiểu duy nhất cho phép ghi đè : hành động xác định lại hành vi của một phương thức được xác định bởi lớp cha. Điều này thường bị nhầm lẫn với quá tải , như chúng ta đã thấy trước đây, là một kiểu đa hình và thực tế không cần phân lớp (thực sự cũng không cần lớp).


vậy còn đa hình dựa trên giao diện thì sao?
siamak

@siamak có phải đó không chỉ là một loại đa hình kiểu con cụ thể mà kiểu mẹ hoàn toàn trừu tượng? Hay bạn ám chỉ điều gì khác?
Nicolas Rinaudo

Ý định của tôi về giao diện là Giao diện như một Kiểu tham chiếu tồn tại trong các ngôn ngữ Hướng đối tượng, như thế này: Giao diện I1 {void M ();} Tôi tin rằng có quá nhiều khác biệt giữa kiểu phụ hoặc Đa hình dựa trên kế thừa và Đa hình dựa trên giao diện . Bởi vì có mối quan hệ "Là một" trong đa hình dựa trên Thừa kế giữa các loại nhưng không có một điều như vậy trong đa hình dựa trên Giao diện. Trong thực tế, một hành vi tương tự với hiện thực khác nhau có thể được chia sẻ giữa nhiều loại khác nhau (lớp)
Siamak

Tôi phải thừa nhận rằng tôi đang bối rối - ngoài cách tiếp cận hơi đạn đạo của bạn đối với cách viết hoa trên, có vẻ như mô tả của bạn về cái bạn gọi là đa hình dựa trên giao diện hoàn toàn giống với mô tả của tôi về đa hình kiểu phụ. Tôi chắc rằng bạn thấy sự khác biệt, nhưng tôi e rằng nó thực sự không rõ ràng đối với tôi.
Nicolas Rinaudo

Như bạn có thể thấy không có mối quan hệ nào giữa ô tô, chim và người nhưng chúng có thể di chuyển theo cách riêng của chúng. Có sự khác biệt to lớn giữa lớp Abstract và Giao diện và việc sử dụng giao diện không giống với kiểu con, vì vậy theo tôi tính đa hình kế thừa và đa hình dựa trên giao diện không giống nhau và không giống nhau. // cứng, mã hóa trong ý kiến phân khúc của nó //
Siamak

6

Có vẻ như các định nghĩa tốt nhất được cung cấp ở đây, vì vậy hãy để tôi thêm hai xu của mình , chỉ dành cho những người quan sát khác. Tôi hy vọng nó có thể giúp được nhiều hơn.

Có hai loại đa hình:

1. Compile-time (static) polymorphism or (ad hoc) polymorphism.

Đó chỉ đơn giản là nạp chồng phương thức và nạp chồng toán tử

2.  Run time or (dynamic) polymorphism.

Thuật ngữ đầu tiên được kế thừa từ thuật ngữ Java và C ++.

Nhưng trong thuật ngữ .NET chỉ có thuật ngữ thứ hai ( ý tôi là đa hình thời gian chạy ) thực sự được coi là đa hình và được gọi đơn giản là đa hình .

Và theo như tôi biết, có ba phương pháp để thực hiện ( thời gian chạy ) đa hình .

 1. Parametric polymorphism or simply the use of generics (templates in C++).

 2. Inheritance-based polymorphism or subtyping.

 3. Interface-based polymorphism.

Một ví dụ đơn giản về tính đa hình dựa trên giao diện:

interface Imobile
{
    void Move();
}

class Person :Imobile
{
    public void Move() { Console.WriteLine("I am a person and am moving in my way."); }
}

class Bird :Imobile
{
    public void Move() { Console.WriteLine("I am a bird and am moving in my way."); }
}

class Car :Imobile
{
    public void Move() { Console.WriteLine("I am a car and am moving in my way."); }
}


class Program
{

    static void Main(string[] args)
    {
        // Preparing a list of objects
        List<Imobile> mobileList = new List<Imobile>();

        mobileList.Add(new Person());
        mobileList.Add(new Bird());
        mobileList.Add(new Car());

        foreach (Imobile mobile in mobileList)
        {
            mobile.Move();
        }

        // Keep the console open
        Console.WriteLine("Press any key to exit the program:");
        Console.ReadKey();
    }
}

Đầu ra:

 I am a person and am moving in my way.
 I am a bird and am moving in my way.
 I am a car and am moving in my way.
 Press any key to exit the program:

Tôi vẫn không thấy sự khác biệt mà bạn tạo ra. Người, Chim và Xe đều là các loại phụ của Imobile. Người là Imobile, Bird là Imobile và Car là Imobile. Nếu bạn yêu cầu một biến loại Imobile, bạn có thể sử dụng một phiên bản Người, Chim hoặc Xe, tất cả đều sẽ nhập kiểm tra. Đó chính xác là ý nghĩa của tính đa hình kiểu phụ.
Nicolas Rinaudo

Chim và Người và Xe không phải là kiểu phụ của Imobile, họ là Người triển khai Giao diện đó và "Hiện thực hóa" Giao diện đó theo cách riêng của họ, Thuật ngữ "kiểu phụ" được sử dụng rộng rãi giữa Kiểu thực và kiểu phụ thực được thừa kế từ nó, và trong tình huống này có một mối quan hệ "Là-một" giữa chúng, ví dụ một con chó là loại phụ của động vật có vú.
siamak

từ quan điểm của trình biên dịch, việc tạo tham chiếu đến một giao diện và sử dụng tham chiếu là điều gì đó đúng và chính xác. / BUT / IT không phải là một khái niệm bình đẳng với kiểu con trong mối quan hệ kế thừa. Và tôi nghĩ rằng việc gọi Người triển khai của một giao diện là kiểu phụ là rất khó xử và thực sự không đúng.
siamak

Một ví dụ về tính đa hình dựa trên Thừa kế sẽ làm tốt để giải thích cho câu trả lời này.
Marcelo Mason

5

Đa hình là một phần mềm mã hóa trừu tượng trong đó một số thực thể cơ bản khác nhau (thường là dữ liệu, nhưng nit luôn) tất cả đều chia sẻ một giao diện chung cho phép chúng trông và hoạt động giống hệt nhau trong thời gian chạy. Chúng tôi sử dụng điều này như một kỹ thuật phát triển để thực thi hành vi nhất quán trên một loạt các trường hợp tương tự, nhưng không giống hệt nhau với cách triển khai tối thiểu tuyệt đối, do đó giảm kỳ vọng về lỗi và sự không nhất quán.

Paul.


5

đa hình == nhiều lớp + chữ ký phương thức giống nhau + hành vi dành riêng cho lớp.


2

Nhiều dạng của một đối tượng được gọi là Đa hình.


2

Tính đa hình

Các đối tượng khác nhau có thể phản hồi cùng một thông báo theo những cách khác nhau, cho phép các đối tượng tương tác với nhau mà không cần biết chính xác kiểu của chúng.

Qua: http://www.agiledata.org/essays/objectOrientation101.html


2

Tính đa hình là khả năng một đối tượng xuất hiện và hoạt động khác nhau đối với cùng một lệnh gọi. ví dụ: mỗi con vật xuất hiện và âm thanh khác nhau (khi bạn đánh nó :))


2

Đa hình là một đặc điểm của ngôn ngữ lập trình cho phép một đối tượng được coi như một thể hiện của siêu kiểu của nó.


Downvoter - Bạn vui lòng giải thích tại sao?
TarkaDaal

1

Đặt một tên duy nhất cho một tập hợp các thao tác tương tự trên các kiểu khác nhau. Khi được thực hiện tốt, sự tương tự là hiển nhiên, chẳng hạn như "thêm" các số theo số học và "thêm" các chuỗi bằng cách nối (tính tổng độ dài của chúng).


1

Đây là định nghĩa mà tôi luôn tuân theo:

Hai đối tượng là đa hình (đối với một giao thức cụ thể) giữa chúng, nếu cả hai đều phản hồi các thông điệp giống nhau với cùng một ngữ nghĩa.

Đa hình là về các thông điệp, là về việc có thể trả lời cùng một tập hợp các thông điệp với cùng một ngữ nghĩa.

Nếu hai đối tượng CÓ THỂ phản hồi trống? nhưng ngữ nghĩa của thông điệp khác nhau thì .. chúng không đa nghĩa.


1

Tính đa hình ở cấp độ thấp hơn là khả năng gọi các phương thức được xác định bởi những người triển khai một giao diện từ cá thể giao diện.


1

Đa hình là một tính năng lập trình cho phép một đối tượng có nhiều kiểu ('hình dạng') và cho phép bạn coi nó như bất kỳ kiểu nào trong số đó tùy thuộc vào những gì bạn cần làm mà không cần biết hoặc quan tâm đến các kiểu khác của nó.


1

Tính đa hình là chức năng ngôn ngữ cho phép mã thuật toán cấp cao hoạt động không thay đổi trên nhiều loại dữ liệu. Và câu kia, bất kể nó là gì ... ;-P.

(Các loại hỗ trợ C ++ được liệt kê và đối chiếu trong câu trả lời của tôi: Tính đa hình trong c ++ )


0

Gần đây, khái niệm đa hình đã trở thành một hiện tượng. Đây là sự trôi dạt thực tế. Runtime xác định phương thức con nào nên được gọi bởi một tham chiếu của một siêu lớp. Bây giờ, điều gì có nghĩa trong thực tế? Nó thực sự không có nghĩa là gì. Bạn có thể viết mã đơn giản mà không cần đa hình. Vậy tại sao? Bởi vì, nếu chúng ta không có tính đa hình, chúng ta phải ghi nhớ tất cả các định nghĩa hàm lớp con. Tính đa hình giúp chúng ta thoát khỏi điều này trong thực tế.

Bạn có thể xác định một danh sách như sau:

List list = new List();

nhưng nếu bạn kiểm tra IList, bạn có thể hưởng lợi từ giao diện như:

IList list = new List();

và sử dụng IListtài liệu tham khảo một cách tự do. Giả sử IListcũng được triển khai trong một lớp khác, bạn có thể sử dụng các phương thức của lớp chưa biết đó thông qua IListtham chiếu lại mà không cần cố gắng nhớ tên lớp đó. Thật tuyệt vời, phải không?

Bây giờ, thông tin có giá trị hơn đang đến:
Java theo mặc định là đa hình, trong khi .NET và C ++ thì không, trong MS, bạn phải khai báo hàm cơ sở virtual(và trong .NEToverride từ khóa ).

Ngoài ra, có 2 quy tắc tích phân trong phép đa hình. Một là kế thừa (thông qua giao diện hoặc mở rộng lớp) và khác là ghi đè. Nếu không ghi đè, đa hình không tồn tại. Lưu ý rằng nạp chồng phương thức (luôn nằm trong một lớp duy nhất) cũng là một kiểu đa hình "tối giản".


1
Đó là hơn 2 câu.
Nguy hiểm

0

Đối với một chữ ký phương thức nhất định, các triển khai phương thức khác nhau được chạy cho các lớp khác nhau, có liên quan đến phân cấp.


0

Tính đa hình là khả năng sử dụng các lớp khác nhau triển khai một giao diện chung (hoặc mở rộng một lớp cơ sở chung) theo một cách chung, mà không cần đến việc triển khai cụ thể và chỉ sử dụng các phương thức có sẵn trong giao diện chung.

Tức là: Trong Java, vì cả ArrayList và LinkedList đều triển khai Danh sách, nếu bạn khai báo một biến là Danh sách, bạn luôn có thể thực hiện các hoạt động được phép trong Danh sách, bất kể biến đó của bạn được cài đặt dưới dạng ArrayList hoặc LinkedList.


0

Các thực thể cùng kiểu (nghĩa là được triển khai cùng một giao diện hoặc dẫn xuất từ ​​cùng một lớp), hoạt động theo những cách khác nhau (dưới cùng một tên phương thức).


0

Tôi nghĩ rằng việc triển khai các phương thức của cùng một chữ ký trong các lớp khác nhau (có một số loại quan hệ kế thừa hoặc sử dụng mở rộng hoặc thực hiện) là ghi đè phương thức và cũng là đa hình vì theo cách này chúng ta đang đạt được nhiều dạng của cùng một chữ ký phương thức.


-2

Tôi đoán đôi khi các đối tượng được gọi động. Bạn không chắc liệu đối tượng có phải là hình tam giác, hình vuông, v.v. trong một hình dạng đa dạng cổ điển hay không. thí dụ.

Vì vậy, để bỏ lại tất cả những thứ như vậy, chúng ta chỉ cần gọi hàm của lớp dẫn xuất và giả sử một trong các lớp động sẽ được gọi.

Bạn sẽ không quan tâm nó là hình vuông, hình tam giác hay hình chữ nhật. Bạn chỉ quan tâm đến khu vực. Do đó, phương thức getArea sẽ được gọi tùy thuộc vào đối tượng động được truyền vào.


-2

Tính đa hình là khả năng của một hàm tự động thích ứng để chấp nhận dữ liệu đầu vào thuộc các kiểu dữ liệu khác nhau. Bạn có thể 'Thêm' hai chuỗi kép '1.1' và '2.2' và nhận '3.3' hoặc 'Thêm' hai chuỗi "Stack" và "Overflow" và nhận "StackOverflow".


Tại sao ai đó lại đánh dấu điều này - đây là 'câu trả lời theo nghĩa đen' từ trang web của National Instrument về tính đa hình !!!
J-Dizzle

-3

Tính đa hình là khi các đối tượng khác nhau phản ứng với cùng một phương thức theo một cách khác. Ví dụ, một chiếc ô tô chuyển động trên đường trong khi một người đi trên đường. Đó là hai đối tượng phản ứng trên cùng một con đường theo một cách khác nhau.


Trên thực tế, đa hình là xem các trường hợp của các lớp khác nhau là một kiểu chung và có thể sử dụng các phương thức được khai báo trong kiểu chung này một cách độc lập với cách các lớp khác nhau triển khai các phương thức đó.
GaRRaPeTa
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.