2011-09-24 26 views
7

Tôi đã cố gắng kế thừa giao diện và tạo một số thuộc tính được tạo tự động dưới dạng riêng tư. Đây là một ví dụ.Thừa kế các thuộc tính với công cụ sửa đổi trợ năng trong C#

public class MyClass 
{ 
    public interface A 
    { 
     int X {get; set;} 
    } 
    public interface B : A 
    { 
     int Y {get; set;} 
    } 

    public class C : A 
    { 
     public int X {get; private set;} 
    } 

Khi tôi cố gắng biên dịch. Tôi gặp lỗi 'MyClass.C' does not implement interface member 'MyClass.A.X.set'. 'MyClass.C.X.set' is not public..

Tôi đã thử với private set; trong iterface A, nhưng tôi lại gặp lỗi này: 'MyClass.A.X.set': accessibility modifiers may not be used on accessors in an interface.

Trình sửa đổi trợ năng này có được phép trong C# không?

Trả lời

21

Tôi đã thử với bộ riêng tư; trong iterface A, nhưng tôi đã nhận lỗi này một lần nữa

Nếu giao diện của bạn chỉ yêu cầu một tài sản nên có thể phục hồi, bạn định nghĩa nó như:

public interface A 
{ 
    int X {get;} // Leave off set entirely 
} 
1

Việc khai báo giao diện xác định nhóm thành viên công khai mà loại triển khai phải có. Vì vậy, nếu C triển khai A, thì phải có thành viên công khai cho từng thành viên được giao diện xác định.

A xác định rằng bất kỳ loại triển khai nào đều phải có tài sản công khai X với công cụ giải công cộng và công cụ đặt công khai. C không đáp ứng yêu cầu này.

+0

Thành viên công khai không phải là tùy chọn duy nhất. Triển khai giao diện rõ ràng là một giao diện khác. – svick

0

Bạn có thể nghĩ đến một giao diện như các chức năng tối thiểu mà lớp học của bạn phải thực hiện. Nếu giao diện chỉ định rằng thuộc tính thể hiện một mệnh đề là get và mệnh đề set thì bạn phải thực hiện mệnh đề công khai getset trong lớp của mình, vì chỉ có phương thức và thuộc tính công khai mới có thể triển khai ngầm định giao diện.

Bạn chỉ cần bỏ từ khóa set trong định nghĩa thuộc tính giao diện nếu bạn không muốn để lộ trình tắt công khai. Sau đó, bạn có thể làm cho trình biến đổi triển khai công khai hoặc riêng tư.

0

Không được phép. Hãy nhớ rằng, mã được sử dụng một thể hiện của class Cphải có thể đối xử với nó như một interface A, có nghĩa là hợp đồng là một getter và setter nào cho bất động sản X.

này áp dụng cho các lớp kế thừa cũng như giao diện thừa kế - bạn phải tuân theo hợp đồng của loại bạn bắt nguồn từ đó.

Nếu mục đích của mã là tài sản X không nên có một setter công cộng, sau đó giao diện cần được xác định chỉ với { get; }

0

Tôi tin rằng các thành viên giao diện phải được công khai nếu giao diện chính nó là công cộng. Việc bạn triển khai thuộc tính bị lỗi vì lý do đó.

+1

Thành viên ngầm triển khai thành viên giao diện phải công khai * bất kể * của miền truy cập của chính giao diện đó. –

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