2010-05-29 45 views
7

Từ bài viết Anders Hejsberg interview, "cách chúng tôi thực hiện phân giải quá tải trong C# khác với bất kỳ ngôn ngữ nào khác" Ai đó có thể cung cấp một số ví dụ với C# và Java?Độ phân giải quá tải C#?

+1

tôi sẽ bắt đầu từ [Eric Lippert's] (http://blogs.msdn.com/b/ericlippert/archive/tags/overload+resolution/) blog. Có 8 bài đăng được đánh dấu được gắn thẻ với ** độ phân giải quá tải **. – R0MANARMY

+0

Tại sao bạn cần một ví dụ? Trong Java, bạn có thể dễ dàng thay thế một hàm trong một lớp con, trong C# bạn đánh dấu hàm là ảo, sau đó có thể ghi đè hàm đó. –

+0

@ R0MANARMY: Đó là câu trả lời đúng cho câu hỏi này. Nếu bạn đăng nó như một câu trả lời, tôi sẽ upvote nó. –

Trả lời

17

gì Anders đã nhận được ở đây là đội ngũ thiết kế ban đầu được thiết kế một cách rõ ràng các thuật toán giải quyết tình trạng quá tải có một số thuộc tính mà làm việc độc đáo với kịch bản phiên bản, mặc dù những đặc tính dường như ngược hoặc khó hiểu khi bạn xem xét các kịch bản mà không versioning .

Có lẽ ví dụ phổ biến nhất là quy tắc trong C# rằng nếu bất kỳ phương thức nào trên lớp có nguồn gốc cao hơn là ứng viên thích hợp, nó sẽ tự động tốt hơn bất kỳ phương pháp nào trên lớp ít xuất phát, phương thức đã nhập có số chữ ký phù hợp hơn. Quy tắc này không phải là, theo hiểu biết của tôi, được tìm thấy bằng các ngôn ngữ khác có độ phân giải quá tải. Nó có vẻ phản trực giác; nếu có một phương thức phù hợp hơn, tại sao không chọn nó? Lý do là vì phương thức phù hợp hơn với chữ ký có thể đã được thêm vào trong phiên bản sau và do đó sẽ giới thiệu một lỗi "lớp cơ sở giòn".

Đối với những suy nghĩ thêm về cách ngôn ngữ khác nhau xử lý thất bại giòn lớp cơ sở, xem

http://blogs.msdn.com/b/ericlippert/archive/tags/brittle+base+classes/

và cho những suy nghĩ thêm về độ phân giải quá tải, xem

http://blogs.msdn.com/b/ericlippert/archive/tags/overload+resolution/

+2

bạn nhận được paged bất cứ khi nào tên của bạn được đề cập trong một câu hỏi để đảm bảo rằng nó được trả lời bất kể thời gian trong ngày;) – R0MANARMY

+0

C++ tự động ẩn tất cả các chức năng có cùng tên, nếu một trong những được định nghĩa trong một lớp học có nguồn gốc. "sử dụng base :: functionname" khai báo (mà "unhides" tên một lần nữa), hiệu quả là tương tự. Nó không phải là chính xác như nhau, bởi vì trong C + + những tên ẩn sẽ không được xem xét ở tất cả, ngay cả khi không có quá tải trong nhiều hơn Nó cũng phục vụ cùng một prupose - các hàm mới trong các lớp cơ sở sẽ không được gọi là vô tình. –

1

Cách C# xử lý quá tải từ góc độ nội bộ là điều khác biệt.

hoàn chỉnh báo giá từ Anders:

Tôi đã luôn luôn được mô tả bản thân mình như một chàng trai thực dụng . Thật buồn cười, bởi vì phiên bản đã kết thúc là một trong các trụ cột của thiết kế ngôn ngữ của chúng tôi. Nó hiển thị cách bạn ghi đè các phương thức ảo trong C#. Ngoài ra, cách chúng tôi thực hiện độ phân giải quá tải trong C# khác với từ bất kỳ ngôn ngữ nào khác mà tôi biết, vì lý do tạo phiên bản. Bất cứ khi nào chúng tôi xem xét việc thiết kế một tính năng cụ thể, chúng tôi sẽ luôn kiểm tra chéo bằng phiên bản. Chúng tôi sẽ hỏi, "Phiên bản thay đổi như thế nào? Làm thế nào để chức năng này từ góc nhìn phiên bản?" Nó chỉ ra rằng hầu hết các thiết kế ngôn ngữ trước khi đã đưa ra rất ít nghĩ đến điều đó.

+0

Vâng .... giải thích [câu hỏi khác] của anh ấy (http://stackoverflow.com/questions/2926470/c-language-design-pillars). – R0MANARMY

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