2009-03-08 27 views
16

Tôi đang tìm cách 'mở rộng' một giao diện bằng cách cung cấp các bộ tiếp cận được đặt cho các thuộc tính trong giao diện đó. Giao diện trông giống như sau:Thêm 'bộ' vào các thuộc tính của giao diện trong C#

interface IUser 
{ 
    string UserName 
    { 
     get; 
    } 
} 

Tôi muốn một cái gì đó như thế này:

interface IMutableUser : IUser 
{ 
    string UserName 
    { 
     get; 
     set; 
    } 
} 

tôi cần thừa kế. Tôi không thể sao chép nội dung của IUser vào IMutableUser và thêm người truy cập đã đặt.

Điều này có thể thực hiện được trong C# không? Nếu vậy, làm thế nào nó có thể được thực hiện?

Trả lời

12

Tôi không thấy bất kỳ lý do tại sao những gì bạn đã gửi không nên làm việc? Chỉ cần làm một bài kiểm tra nhanh và nó biên dịch hoàn toàn, nhưng đưa ra một cảnh báo về việc trốn. Điều này có thể được khắc phục bằng cách thêm từ khóa mới, như sau:

public interface IMutableUser : IUser 
{ 
    new string Username { get; set; } 
} 

Một phương án thay thế là thêm các phương thức đặt rõ ràng; ví dụ:

public interface IMutableUser : IUser 
{ 
    void SetUsername(string value); 
} 

Tất nhiên, tôi muốn sử dụng người đặt chỗ, nhưng nếu không thể, tôi đoán bạn làm những gì bạn phải làm.

+0

Thêm mới làm việc tuyệt vời! Cảm ơn! Bạn có thể cập nhật câu trả lời của mình bằng một ví dụ (cho người khác) không? – strager

+0

Từ quan điểm thực tế: các giao diện phát triển rất chậm theo thời gian. Tất cả những người triển khai giao diện sẽ phá vỡ mọi thay đổi đối với hợp đồng này .... –

+0

@PatrickPeters - Tôi cho rằng nhận xét đó được hướng vào phương pháp SetUserName? Tôi không thấy vấn đề với tùy chọn đầu tiên. Một số điểm ngắt có thể được loại bỏ nếu người triển khai thực hiện theo cách thực hiện rõ ràng khi thích hợp. – Maslow

8

Bạn có thể sử dụng một lớp trừu tượng:

interface IUser 
{ 
    string UserName 
    { 
     get; 
    } 
} 

abstract class MutableUser : IUser 
{ 
    public virtual string UserName 
    { 
     get; 
     set; 
    } 
} 

Một khả năng khác là để có điều này:

interface IUser 
{ 
    string UserName 
    { 
     get; 
    } 
} 

interface IMutableUser 
{ 
    string UserName 
    { 
     get; 
     set; 
    } 
} 

class User : IUser, IMutableUser 
{ 
    public string UserName { get; set; } 
} 
+0

Tôi cần MutableUser kế thừa IUser. Tôi sẽ xem xét phương pháp đầu tiên. – strager

+0

Sử dụng một lớp trừu tượng hoạt động. Tuy nhiên, nó không có vẻ là giải pháp sang trọng nhất ở đây. Sẽ để câu hỏi này mở ra một chút cho những câu trả lời "tốt hơn" có thể. – strager

7

Bạn có thể "ghi đè" các thuộc tính trong giao diện bằng cách triển khai rõ ràng các giao diện. Câu trả lời của Chris có thể là tất cả những gì bạn cần cho kịch bản mà bạn đã phác thảo, nhưng hãy xem xét một kịch bản phức tạp hơn một chút, nơi bạn cần getter/setter trên lớp của bạn, nhưng giao diện chỉ định nghĩa getter. Bạn có thể giải quyết vấn đề này bằng cách thực hiện như sau:

public class MyUser : IUser 
{ 

    IUser.MyProperty { get { return "something"; } } 

    public MyProperty { get; set; } 

} 

Bằng cách thực hiện rõ ràng hợp đồng. Tuy nhiên, bằng cách cung cấp công khai MyProperty, API cho đối tượng của bạn sẽ không bao giờ hiển thị phiên bản giao diện rõ ràng và sẽ luôn sử dụng MyProperty với get/set.

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