2010-03-10 22 views
18

Chỉnh sửa:Hóa ra tôi đã bỏ sót điều gì đó hiển nhiên, nhưng tôi sẽ để câu hỏi mở trong trường hợp người khác phạm phải sai lầm rõ ràng. Nhờ những người đã chỉ ra nóXem phần dưới để được giải thích.Việc thêm thuộc tính vào giao diện có ngăn chặn việc tạo "bộ" riêng tư/được bảo vệ trong các loại có nguồn gốc không?

Có thể đặt không công khai trên thuộc tính ghi đè thuộc tính giao diện không?

Có lẽ tôi đang có một khoảnh khắc ngu ngốc, nhưng có vẻ như tôi có một tài sản được định nghĩa trong giao diện đòi hỏi rằng không có lớp phát sinh nào có thể cung cấp bất kỳ bộ công khai nào cho thuộc tính nói trên.

Ví dụ:

interface IField 
{ 
    bool IsValid { get; } 
} 

... và vì tính chất giao diện có thể không có khả năng tiếp cận bổ nghĩa là:

class Field : IField 
{ 
    public override bool IsValid { get; protected set; } 
} 

... sẽ không thể bất chấp thực tế rằng nó đáp ứng giao diện yêu cầu khái niệm.

IMO điều này có ý nghĩa tiêu cực lớn đối với việc đóng gói có thể được thực hiện thông qua các thuộc tính không công khai, và ngăn chặn một số patters sử dụng phổ biến cho Propertes.

Tôi biết rằng bạn có thể tạo thành viên SetIsValid không công khai sửa đổi một cửa hàng sao lưu phổ biến, nhưng điều đó sẽ tạo ra một mẫu không phù hợp và thêm tiếng ồn mã khác là không cần thiết.

Tôi đã bỏ lỡ điều gì đó chưa?


Edit: Có, tôi mất cái gì

Tôi đang thay đổi mã của người khác vào lúc này và chỉ nhận ra rằng lớp tôi đã vật lộn với thực hiện giao diện và có nguồn gốc từ một lớp cơ sở. Và tôi mới đến C# Đó là những gì gây ra sự nhầm lẫn ghi đè.

lớp thực tế trông giống như:

class Field : IField, BaseField 
{ 
    public override bool IsValid { get; protected set; } 
} 

... nơi BaseField thực hiện giao diện là tốt, nhưng đã không thực hiện các thiết lập.

+1

Bạn có cố gắng biên dịch ví dụ của mình trước không? Giao diện mẫu của bạn không chính xác vì bạn có công cụ sửa đổi công khai, điều này là bất hợp pháp. Ngoài ra, định nghĩa lớp học của bạn không chính xác vì bạn có từ khóa ghi đè trên định nghĩa giao diện, đó là bất hợp pháp.Một khi bạn sửa chữa cho hai điều đó, nó biên dịch tốt và sẽ hoạt động như bạn mong muốn. – Nick

+0

Công chúng trong giao diện là một lỗi đánh máy. – Catskul

+1

Có, bạn đang có một trong những khoảnh khắc đó. –

Trả lời

32

Điều này hoàn toàn hợp pháp. Bạn không cần phải từ khóa override (trong thực tế nó sẽ không biên dịch) nhưng có gì ngăn cản bạn từ việc này là:

interface IField 
{ 
    bool IsValid { get; } 
} 

class Field : IField 
{ 
    public bool IsValid { get; protected set; } 
} 
+0

Vì vậy, nếu tôi đã vượt qua một IField đề cập đến một đối tượng Field, và gọi IsValid, Field.IsValid sẽ được gọi là mặc dù thiếu "ghi đè"? – Catskul

+0

'ghi đè' áp dụng cho các lớp cơ sở mà bạn kế thừa từ, chứ không phải các giao diện mà bạn triển khai. – Gabe

+0

ah. Tôi đang sửa đổi mã của người khác tại thời điểm này và chỉ nhận ra rằng lớp tôi đã đấu vật với thực hiện giao diện * và * bắt nguồn từ một lớp cơ sở. Đó là những gì gây ra sự nhầm lẫn ghi đè. – Catskul

6

Đó là thể trên giao diện, nhưng không phải trên trừu tượng/ảo bất động sản - bạn có thể có hai hỗn hợp này.

+0

Không phải tất cả các thành phần của giao diện theo định nghĩa đều là ảo sao? (Tôi hơi mới với C#) – Catskul

+0

Tôi đã bỏ lỡ vấn đề thực sự. Xem bài đăng đã sửa đổi. Cảm ơn câu trả lời, nó đã giúp tôi xem những gì tôi đã bỏ lỡ. – Catskul

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