2012-02-10 16 views
8

Tôi biết tôi không thể quá tải loại trả lại (Tôi nghĩ mình biết điều này).Làm thế nào để ISet có hai phương thức Add (T item) chỉ thay đổi theo kiểu trả về?

void F() 
{ 
} 

bool F() 
{ 
    return true; 
} 

..produces lỗi already defines a member called 'F' with the same parameter types

Tuy nhiên, tôi đang đọc documentation for ISet from MSDN, và tôi nghĩ rằng tôi nhìn thấy hai Thêm phương pháp mà chỉ khác nhau tùy theo kiểu trả về.

Điều gì đang xảy ra ở đây?

+0

cảm ơn câu trả lời, tôi sẽ chọn ngẫu nhiên một câu trả lời là câu trả lời –

Trả lời

4

Phương thức "Thêm" đầu tiên thực sự là ICollection<T>.Add, được kế thừa.

Khi điều này được thực hiện trong một lớp học, ít nhất một trong hai Add phương pháp này sẽ cần phải được thực hiện một cách rõ ràng, ví dụ:

void ICollection<T>.Add(T item) 
{ 
    // ... Implement here 
+0

chỉ tò mò, bạn nói "thực hiện trong một lớp học" - đó là trái ngược với thực hiện trong một cấu trúc? –

+0

@Gabriel No - được triển khai dưới mọi hình thức. Điều đó đang được nói, một cấu trúc thực thi 'ISet ' sẽ là ** rất ** không phù hợp. ;) Nó không phù hợp với bất kỳ yêu cầu được đề xuất nào cho cấu trúc, vì nó sẽ là> 16 byte, có thể thay đổi, v.v. –

4

Phương thức Add khác là explicitly implemented interface method.

Khi phương thức giao diện được triển khai một cách rõ ràng, nó không thể được gọi mà không truyền tham chiếu đến kiểu giao diện trước, điều này làm cho các cuộc gọi trở nên rõ ràng và do đó có nhiều phương thức có cùng chữ ký.

Để làm điều này trong mã của bạn, bạn muốn làm, ví dụ

class MyCollection<T> : ICollection<T> { 
    public void Add() { ... } 
    void ICollection<T>.Add() { ... } 
} 

này tránh được việc phải đưa ra tên phương pháp thay thế để tránh va chạm với những cái tên giao diện, khi bạn muốn phương pháp giao diện để làm điều gì đó hơi khác so với phương pháp khác.

+1

Nói rằng phương thức Thêm khác là phương thức giao diện được triển khai rõ ràng là sai. Phương thức giao diện * được thực hiện rõ ràng * chỉ có thể xuất hiện trong một lớp/struct và không bao giờ có thể xuất hiện trên một giao diện, vì các giao diện không thể có * thực hiện * bên ngoài một lớp/struct. Cả hai phương thức mà bạn đang đề cập là các phương thức giao diện, một phương thức trên ISet và phương thức kia là trên ICollection, và cả hai phương thức này đều không được thực hiện một cách rõ ràng khi chúng ta không đề cập đến các lớp thực hiện các giao diện này. Có lẽ bạn có thể sử dụng từ ngữ tốt hơn. –

+0

@zespri: Bạn nói đúng. Tôi đã không nhìn vào trang đúng cách và không nhận thấy rằng đó là một giao diện và không phải là một lớp học. Bạn nên đăng bình luận của bạn như là một câu trả lời, bởi vì rõ ràng là có sự khác biệt giữa các giao diện và các lớp ở đây. –

3

phương pháp giao diện có thể được thực hiện một cách rõ ràng, như vậy:

public class Something : IINterface1, IInterface2 
{ 
    public bool DoSomething(); 
    public void IInterface2.DoSomething(); 
} 

Bây giờ phương pháp trở về void chỉ thể truy cập nếu bạn cast lớp để giao diện:

Something s = new Something(); 
IInterface2 i = (IInterface2)s; 
i.DoSomething(); // method returning void 
Các vấn đề liên quan