Интерфейсы с разными геттерами и сеттерами для одинаковых свойств - PullRequest
7 голосов
/ 26 октября 2009

Я сделал следующее объявление для интерфейсов:

public interface IBasic
{
  int Data { get; }
}

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

Компилятор говорит, что IChangeable.Data скрывает IBasic.Data. Это разумно. Я нашел альтернативу:

public interface IBasic
{
  int Data { get; }
}

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

Есть ли способ определить сеттер и геттер для одного и того же свойства в разных иерархиях интерфейсов? Или есть какие-то альтернативы этому подходу?

Ответы [ 3 ]

4 голосов
/ 26 октября 2009

Вы можете повторно объявить его (или, скорее, сообщить компилятору, что намереваетесь скрыть его):

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;}  }
}

Но это сбивает с толку, и вам нужно будет использовать явные реализации и т. Д., И, возможно, немного озвучивать вызывающего, если вы хотите использовать скрытую версию. Если вы пошли по этому пути, я бы порекомендовал выставить get и set на 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; } }
}

Ре комментарии; выставить на реализующий тип:

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; }
    }
}

Это также будет работать, если вы сделаете это (что я предпочитаю):

public interface IChangeable : IBasic
{
    new int Data { get; set; }
}
1 голос
/ 26 октября 2009

Мне кажется, методы GetData и SetData более понятны для этой ситуации:

public interface IBasic
{  
    int GetData();
}

public interface IChangeable : IBasic
{  
    void SetData(int data)
}
1 голос
/ 26 октября 2009

Может быть, я неправильно понял ваш вопрос, но вы просто не сделаете

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

т.е. Позвольте IChangeable переопределить свойство, но оставьте подарок "get".

Поскольку IChangeable наследует от IBasic, я предполагаю, что вы хотите, чтобы реализация IChangeable имела реализацию "get".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...