2009-10-26 30 views
7

Tôi đã đưa ra tuyên bố sau đây cho các giao diện:Giao diện với getter và setter khác nhau cho cùng một propertie

public interface IBasic 
{ 
    int Data { get; } 
} 

public interface IChangeable : IBasic 
{ 
    int Data { set; } 
} 

Trình biên dịch nói rằng IChangeable.Data ẩn IBasic.Data. Nó hợp lý. Giải pháp thay thế tôi đã tìm thấy là:

public interface IBasic 
{ 
    int Data { get; } 
} 

public interface IChangeable : IBasic 
{ 
    void ChangeData(int value); 
} 

Có cách nào để xác định setter và getters cho cùng một thuộc tính trên phân cấp khác nhau trên giao diện không? Hoặc có bất kỳ lựa chọn thay thế cho phương pháp này?

+0

Không cần phải khai báo tài sản trong IChangeable vì tất cả các đối tượng mà thực hiện IChangeable cũng phải thực hiện IBasic (do IChangeable: IBasic) – sisve

+0

@ Simon: Tôi đã cho thấy một sự đơn giản hóa vấn đề. Về vấn đề thực sự của tôi, The IBasic tuyên bố nhiều điều hơn. – FerranB

+0

@Simon - Tôi cũng đã mắc sai lầm này ban đầu. Anh ta muốn IChangeable thêm người định cư. – tvanfosson

Trả lời

4

Bạn có thể khai báo lại nó (hay đúng hơn, hãy nói với trình biên dịch mà bạn có ý định để ẩn nó):

public interface IChangeable : IBasic 
{ 
    new int Data { set; } 
} 
class Foo : IChangeable 
{ 
    private int value; 
    int IBasic.Data { get { return value; } } 
    int IChangeable.Data { set {this.value = value;} } 
} 

Nhưng điều này là khó hiểu, và bạn sẽ cần phải sử dụng hiện thực rõ ràng vv, và có thể là một chút đúc ở người gọi nếu bạn muốn sử dụng phiên bản ẩn. Nếu bạn đi tuyến đường này, tôi muốn giới thiệu để lộ cả getset trên IChangeable:

public interface IChangeable : IBasic 
{ 
    new int Data { get; set; } 
} 
class Foo : IChangeable 
{ 
    private int value; 
    int IBasic.Data { get { return value; } } 
    int IChangeable.Data { set { this.value = value; } get {return value; } } 
} 

Re ý kiến; để lộ vào loại thực hiện:

public interface IChangeable : IBasic 
{ 
    new int Data { set; } 
} 
public interface IBasic 
{ 
    int Data { get; } 
} 
class Foo : IChangeable 
{ 
    private int data; 
    public int Data { 
     get { return data; } 
     set { data = value; } 
    } 
} 

Điều này cũng sẽ có tác dụng nếu bạn thực hiện nó (mà tôi thích):

public interface IChangeable : IBasic 
{ 
    new int Data { get; set; } 
} 
+0

Trong phương pháp này, đó là cách để gán giá trị cho Foo.Data? – FerranB

+0

'IChangeable c = {some foo}; c.Data = {some value}; 'Bạn cũng có thể đặt thuộc tính trên API công khai, nhưng nó không rõ ràng từ câu hỏi liệu đó có phải là' get', 'set', cả hai, v.v. –

+0

I muốn cho phép người triển khai 'IChangeable' có' get' và 'set'. – FerranB

1

Có lẽ tôi đã hiểu lầm câu hỏi của bạn, nhưng bạn sẽ không chỉ làm

public interface IChangeable : IBasic 
{ 
    int Data { get; set; } 
} 

nghĩa là hãy để IChangeable ghi đè thuộc tính nhưng giữ "hiện diện".

Vì IChangeable kế thừa từ IBasic Tôi giả định bạn muốn triển khai IChangeable để có triển khai "get".

1

Tôi nghĩ GetData và phương pháp SetData là rõ ràng hơn cho tình huống này:

public interface IBasic 
{ 
    int GetData(); 
} 

public interface IChangeable : IBasic 
{ 
    void SetData(int data) 
} 
+0

Còn thuộc tính 'Dữ liệu' chỉ đọc với phương thức' SetData' thì sao? –

+0

2 phương pháp rõ ràng hơn đối với tôi trong trường hợp này. – bniwredyc

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