2009-10-20 20 views
5

Tôi có một nghi ngờ ngu ngốc.Thông thường "System.Object" triển khai "Bằng". Khi tôi triển khai Giao diện IE có thể cung cấp cho định nghĩa tùy chỉnh (tôi tin như vậy) đối với "Bằng" của tôi.Nội bộ của "bằng" trong .NET

để thực hiện lớp giáo sư bằng

class Professor:System.Object,IEquatable 

kể từ khi có những định nghĩa khác nhau của System.Equals, và Equals IEquatable của, Tại sao không C# báo cáo lỗi? .Bởi Tôi không trọng "Bằng" và thậm chí không Ẩn "Bằng" bằng từ khóa mới.

class Professor : IEquatable<Professor> 
{ 

    public string Name { get; set; } 

    public bool Equals(Professor cust) 
    { 
     if (cust == null) return false; 
     return cust.Name == this.Name; 
    } 

} 
+1

Tôi đề nghị hỏi câu hỏi IComparable của bạn như một câu hỏi riêng biệt, bởi vì đó là câu hỏi thiết kế, trong khi câu hỏi chính của bạn có liên quan nhiều hơn đến sự can đảm của.Mô hình đối tượng của NET. – Welbog

+0

ok tôi sẽ làm điều đó – user193276

Trả lời

8

Bạn đang không trọng cũng không giấu Object.Equals() vì phiên bản của bạn mất giáo sư như một loại tham số - không phản đối. Bạn là overloading phương thức Equals().

C# cho phép hai phương pháp có cùng tên khác nhau về loại đối số mà họ chấp nhận. Điều này được gọi là quá tải - nó có thể được xem như là đa hình thời gian biên dịch.

Overriding (bạn có thể, và có lẽ cũng nên làm) làm thay đổi cách triển khai phương thức từ phiên bản trong lớp cơ sở. Đây là cơ sở cho đa hình kiểu thời gian chạy.

Hiding là một kỹ thuật ít phổ biến cho phép một lớp được thừa kế để mặt nạ một phiên bản của một phương pháp trong một lớp cơ sở. Dựa trên loại tham chiếu mà bạn thực hiện cuộc gọi, bạn có thể hoặc lấy phiên bản lớp cơ sở (nếu được gọi thông qua tham chiếu lớp cơ sở) hoặc phiên bản lớp dẫn xuất (nếu được gọi thông qua tham chiếu kiểu dẫn xuất).

Trong câu hỏi thứ hai, bạn nên sử dụng IEquatable<T> khi có ngữ nghĩa để so sánh 'bình đẳng' của hai trường hợp tách biệt với bình đẳng tham chiếu.

Bạn nên triển khai IComparable hoặc IComparable<T> khi có ngữ nghĩa cho các mục đặt hàng. Có nghĩa là chúng có thể nhỏ hơn, lớn hơn hoặc tương đương.

+0

Đánh bại tôi với nó :) Tôi đã nhận thấy một số nhầm lẫn xung quanh ý tưởng có quá tải nơi chữ ký của một trong những chỉ là cụ thể hơn nhưng tương thích với nhau. (ví dụ: Giáo sư> đối tượng) –

+0

thì tôi có thể nói quá tải là tính đa hình thời gian biên dịch và ghi đè là đa hình thời gian chạy không? – user193276

+0

@generix: Có, bạn có thể. Đọc này: http://wiki.answers.com/Q/Difference_between_runtime_and_compile_time_polymorphism – LBushkin

1

Phương thức Object.Equals chấp nhận đối tượng kiểu 'đối tượng' làm tham số của nó. Phương thức Equals của bạn chấp nhận một đối tượng kiểu 'Professor' làm tham số của nó. Cả hai phương thức này có thể cùng tồn tại bởi vì nó là hợp pháp để phân biệt hai phương thức có tên giống nhau theo danh sách tham số của chúng; đây là quá tải phương thức cuộc gọi.

1

Bạn không cần phải triển khai IEquatable một cách rõ ràng nếu tất cả những gì bạn muốn làm là ghi đè cài đặt Equals() mặc định.

Bạn chỉ có thể làm điều gì đó như thế này:

class Professor 
{ 

    public string Name { get; set; } 

    public override bool Equals(object cust) 
    { 
     if (cust == null || !(cust is Professor)) return false; 
     return cust.Name == this.Name; 
    } 

} 

Hãy lưu ý rằng nếu bạn ghi đè Equals(), bạn cũng nên ghi đè GetHashCode() để đảm bảo hoạt động đúng đắn của từ điển và các bộ sưu tập khác mà làm cho sử dụng băm để phân biệt giữa các đối tượng. Đây là trang MSDN guidelines for overriding Equals().

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