2009-09-08 26 views
7

Khi tôi cần triển khai thành viên giao diện một cách rõ ràng, nó là riêng tư.C# - Lý do cho "Các thành viên giao diện được triển khai rõ ràng luôn ẩn hoàn toàn riêng tư?"

ví dụ:

// when explicit implementation it is always private 
    void IPointy.Draw() 

    { 

    } 

tại sao quy tắc thiết kế như vậy được thi hành?

Lưu ý:

Khi hai giao diện có phương pháp tương tự, để tránh cuộc đụng độ tôi phải thực hiện một cách rõ ràng là như

class Line :IPointy 
{ 

     // Now it is private  
     void IPointy.Draw() 

     { 


     } 

} 

Câu hỏi của tôi là lý do để thực hiện là như tư nhân.

Trả lời

0

Bởi vì 2 giao diện được thực hiện bởi lớp đó rõ ràng có thể có phương thức có cùng tên. Đó là lý do tại sao phương thức đó là riêng tư khi truy cập theo tham chiếu lớp và công khai khi giao diện.

+0

Nhưng tôi vẫn đang giới thiệu chúng một cách rõ ràng. Xung đột xảy ra? –

+0

khi bạn đang tham chiếu một cách rõ ràng, phương thức này là công khai, hãy xem bài đăng đã chỉnh sửa ... –

0

Vì bạn đang nói khi đối tượng của tôi là một IPointy hơn bạn có thể gọi vẽ phương thức IPointy. Nếu không thì không.

public interface IPointy 
{ 
    void Draw(); 
} 

public class PointyImplementer : IPointy 
{ 
    #region IPointy Members 

    void IPointy.Draw() 
    { 
     Console.WriteLine("You have drawn"); 
    } 

    #endregion 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     IPointy pi = new PointyImplementer(); 

     pi.Draw(); 

     Console.Read(); 
    } 
} 

Đây là cách để bạn che dấu giao diện bạn đang triển khai.

18

Các thành viên giao diện được triển khai rõ ràng không đơn giản là riêng tư. Chúng là công khai.

Họ công khai rằng bất kỳ mã nào có thể truyền tham chiếu đến giao diện đều có thể gọi cho họ. (Nếu bản thân giao diện không được công khai, thì tôi đoán bạn có thể nói rằng chúng có cùng cấp độ truy cập như giao diện.)

Chúng không có cấp truy cập cụ thể vì chúng có công khai các điều khoản của giao diện: không có sự lựa chọn nào liên quan. Họ không phải là thành viên công cộng giống như các thành viên công cộng bình thường của một loại, nhưng họ có thể gọi từ bất kỳ hội đồng nào khác có thể giữ một tài liệu tham khảo và đưa nó vào loại giao diện ...

C# 3.0 đặc điểm kỹ thuật đặt nó theo cách này:

viên giao diện Explicit triển khai có những đặc điểm khả năng tiếp cận khác so với thành viên khác. Bởi vì rõ ràng việc triển khai thành viên giao diện là không bao giờ truy cập được thông qua tên đầy đủ đủ điều kiện trong lời gọi phương thức hoặc quyền truy cập thuộc tính, chúng ở chế độ riêng tư theo ý nghĩa . Tuy nhiên, vì chúng có thể truy cập thông qua giao diện , chúng theo nghĩa cũng là công khai.

+0

Chúng không phải là riêng tư, chúng là công khai. Nhưng bạn cần phải có một đối tượng giao diện để có thể gọi nó. Lý tưởng nhất là nếu bạn làm việc với giao diện, bạn cũng sử dụng biến kiểu IMyInterface chứ không phải lớp MyImplementation. Một điều thú vị khác là bạn có thể triển khai các giao diện khác nhau với cùng một chữ ký phương thức - một cách rõ ràng. – van

+0

Bạn bè nhìn thấy bản cập nhật của tôi.Khi explicilty thực hiện nó, nó không bao giờ là công khai. –

+1

@van: Vâng, tôi thích hơi co ở đây. Nếu bạn sử dụng ildasm, bạn sẽ thấy rằng nó được khai báo là "riêng tư". Nó không công khai theo nghĩa thông thường ... và cũng không phải là riêng tư theo nghĩa thông thường. –

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