2013-05-14 19 views
9

Khi tôi xác định một giao diện có chứa một chỉ ghi tài sản:Có thể triển khai thực hiện setter tài sản một cách rõ ràng trong khi có một getter công khai không?

public interface IModuleScreenData 
{ 
    string Name { set; } 
} 

và cố gắng (ngây thơ) thực hiện nó một cách rõ ràng với một ý định cho tài sản để cũng có một getter công bố công khai:

public class ModuleScreen : IModuleScreenData 
{ 
    string IModuleScreenData.Name { get; set; } 
} 

sau đó tôi nhận được lỗi sau:

Error 'IModuleScreenData.Name.get' adds an accessor not found in interface member 'IModuleScreenData.Name'

lỗi này là nhiều hay ít mong đợi, tuy nhiên, sau khi cú pháp thay thế này:

public class ModuleScreen : IModuleScreenData 
{ 
    public string Name { get; IModuleScreenData.set; } 
} 

không biên dịch được, tôi cho rằng những gì tôi đang cố gắng thực hiện không thực sự khả thi. Tôi có đúng không, hoặc có một số cú pháp bí mật sốt sau cùng không?

Trả lời

10

Bạn có thể làm điều này:

public class ModuleScreen : IModuleScreenData 
{ 
    string IModuleScreenData.Name 
    { 
     set { Name = value; } 
    } 

    public string Name { get; private set; } 
} 

Trên bên lưu ý, tôi thường sẽ không khuyên bạn nên thiết lập chỉ tài sản. Một phương pháp có thể làm việc tốt hơn để thể hiện ý định.

+0

Tôi đồng ý với ghi chú bên, mặc dù cách khác vòng - giao diện với thuộc tính chỉ đọc, được thực hiện bởi một lớp tài sản đó có thể ghi được -, mà giải pháp của bạn cũng được giữ, có thể chấp nhận được và được cho là phổ biến hơn nhiều. –

+0

Cảm ơn vì điều này ... –

-1

Bạn không thể thay đổi cách giao diện được triển khai trong lớp kế thừa. Đó là toàn bộ vấn đề .. nếu bạn cần làm một cái gì đó mới với một thuộc tính, bạn có thể tạo ra một thuộc tính mới có tham chiếu đến việc thực thi đặc tính được thừa hưởng cụ thể. Các giao diện có sẵn để bạn có thể tuân thủ một tiêu chuẩn được chỉ định cho việc thừa kế đối tượng.

UPDATE: Ngày nghĩ thứ hai .. bạn nên có thể chỉ cần làm điều này .... này sẽ biên dịch tốt:

public class ModuleScreen : IModuleScreenData 
    { 
     public string Name { get; set; } 
    } 
+0

Tôi muốn tránh tạo thuộc tính mới, nếu có thể. Bạn không chắc chắn ý bạn là gì bằng cách thay đổi cách giao diện được triển khai - tôi hiểu rằng tôi phải thỏa mãn hợp đồng chứa trong giao diện và việc triển khai rõ ràng chắc chắn là một trong những cách để thực hiện điều đó. –

+0

Xem cập nhật của tôi .... bạn sẽ có thể chỉ cần thêm nhận và đáp ứng giao diện – miskiw

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