2010-10-01 26 views
7


Sự khác nhau giữa đa hình thời gian chạy và tính đa hình thời gian biên dịch là gì? Ngoài ra, sự khác biệt giữa ràng buộc sớm và ràng buộc muộn là gì? Ví dụ sẽ được đánh giá cao.C# Polymorphism

+7

Bạn cần hỏi * một * câu hỏi. Những thuật ngữ này không có điểm chung. –

+3

Bạn muốn các ví dụ cho google tốt hơn? –

+6

Điều này có nên được gắn thẻ là 'bài tập về nhà' không? – keyboardP

Trả lời

31

Compile Time Polymorphism

Phương pháp quá tải là một ví dụ tuyệt vời. Bạn có thể có hai phương thức có cùng tên nhưng có chữ ký khác nhau. Trình biên dịch sẽ chọn phiên bản chính xác để sử dụng tại thời gian biên dịch.

Run-Time Polymorphism

Trọng một phương pháp ảo từ một lớp cha mẹ trong một lớp trẻ là một ví dụ điển hình. Khác là một phương thức triển khai lớp từ một Giao diện. Điều này cho phép bạn sử dụng loại mã chung hơn trong khi sử dụng việc triển khai được chỉ định bởi đứa trẻ. Căn cứ vào định nghĩa lớp sau:

public class Parent 
{ 
    public virtual void SayHello() { Console.WriteLine("Hello World!"); } 
} 

public class Child : Parent 
{ 
    public override void SayHello() { Console.WriteLine("Goodbye World!"); } 
} 

Đoạn mã dưới đây sẽ đưa ra "Tạm biệt thế giới!":

Parent instance = new Child(); 
instance.SayHello(); 

sớm Binding

Xác định loại tại thời gian biên dịch:

SqlConnection conn = new SqlConnection(); 

Late Bind ing

Các loại được xác định tại thời gian chạy:

object conn = Activator.CreateInstance("System.Data.SqlClient.SqlConnection"); 
+1

cách .Net Generics phù hợp với hình ảnh ở đây? Trong C++, các khuôn mẫu thể hiện tính đa hình thời gian biên dịch. thx –

3

UPDATE: Hãy xem ý kiến ​​Eric Lippert của câu trả lời này.

Trong C# 2 tất cả ràng buộc là sớm, bởi vì C# 2 là một ngôn ngữ gõ tĩnh. Một ngôn ngữ ràng buộc muộn sẽ là một trong đó ràng buộc phương thức xảy ra trong thời gian chạy. (C# 4 bao gồm một tính năng ràng buộc muộn với sự ra đời của dynamic.)

Tôi không chắc chắn ý của bạn là thời gian chạy so với tính đa hình thời gian biên dịch.

Trình biên dịch C# sẽ xác định thời gian biên dịch mà quá tải phương thức sẽ được gọi. Loại thời gian chạy của một cá thể sẽ xác định việc thực hiện một quá tải phương thức cụ thể nào sẽ được thực thi. Điều này vẫn được coi là ràng buộc sớm ngay cả khi nó xảy ra trong thời gian chạy, bởi vì phương pháp được chọn bị ràng buộc là việc thực hiện quá tải phương thức ảo cụ thể và không thể thực hiện cuộc gọi như vậy để tạo ra ngoại lệ liên quan đến loại xảy ra với một ngôn ngữ động và ràng buộc muộn.

+0

C# 2 hỗ trợ kết buộc trễ ở cấp độ ngôn ngữ dưới dạng * công văn ảo *. Trong các ngôn ngữ công văn ảo, cuộc gọi phương thức là * bị ràng buộc trễ * vì * phương thức chính xác * được gọi là không được xác định cho đến * thời gian chạy *. Chữ ký * của phương thức được xác định tại thời gian biên dịch nhưng phương thức * thực sự được gọi là * thì không. C# 4 hỗ trợ liên kết trễ động: nó có thể xác định mọi thứ * về phương thức (ngoại trừ tên của nó) khi chạy. –

+0

Re: cập nhật của bạn: Ý kiến ​​khác nhau. Một số người xem xét công văn ảo bị ràng buộc trễ vì phương thức được gọi là được xác định khi chạy. (Những người này có khuynh hướng là người có nền trong C hoặc một số ngôn ngữ chủ yếu khác là ràng buộc tĩnh). Một số người cho rằng nó có liên kết sớm vì * khe * chứa con trỏ phương thức được xác định tại thời gian biên dịch. (Những xu hướng được những người được sử dụng để lập trình COM hoặc C + +, nơi hầu như mọi cuộc gọi là ảo.) Cá nhân tôi cố gắng chỉ sử dụng "cuối ràng buộc" có nghĩa là "năng động". –

+0

@Eric Lippert - OK, điều đó có ý nghĩa. Việc bạn sử dụng "ràng buộc trễ" có vẻ tương tự như của tôi sau đó. Tôi đã luôn luôn nghĩ về "sớm" và "muộn" để chỉ ra, có hiệu lực, thời gian mà tại đó lỗi được phát hiện khi có sự cố. Cảm ơn ý kiến ​​của bạn! –

3

Câu trả lời rất đơn giản và thẳng về sự khác biệt giữa thời gian biên dịch và đa hình thời gian chạy.

Tính đa hình thời gian biên dịch - Quá tải phương thức (Có cùng tên phương thức nhưng có chữ ký khác nhau).Vui lòng kiểm tra video trên phương pháp quá tải tại URL này http://csharp-video-tutorials.blogspot.com/2012/06/part-25-c-tutorial-method-overloading.html

Run Time Polymorphism - Phương pháp Overriding (Gọi các phương thức lớp con ghi đè vào thời gian chạy, sử dụng một biến tham chiếu lớp cơ sở được gọi là chạy thời gian polymorphism). Vui lòng kiểm tra các video về phương pháp ghi đè (Đa hình) tại URL này http://csharp-video-tutorials.blogspot.com/2012/06/part-23-c-tutorial-polymorphism.html