Предотвращает ли добавление свойств в интерфейс создание частного / защищенного «набора» в производных типах? - PullRequest
18 голосов
/ 10 марта 2010

Редактировать: Оказывается, я упустил что-то очевидное, но я собираюсь оставить вопрос открытым, если кто-то другой совершит такую ​​же очевидную ошибку. Спасибо тем, кто указал на это См. Объяснение внизу.

Можно ли установить непубличный набор для свойства, которое переопределяет свойство интерфейса?

Возможно, у меня тупой момент, но мне кажется, что наличие свойства, определенного в интерфейсе, подразумевает, что ни один производный класс не может предоставить какой-либо непубличный набор для указанного свойства.

Пример:

interface IField
{
    bool IsValid { get; }
}

... и поскольку свойства интерфейса могут не иметь модификаторов специальных возможностей, это означает, что:

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

... будет невозможно, несмотря на то, что он соответствует требованиям интерфейса концептуально .

IMO, это имеет большие негативные последствия для инкапсуляции, которые могут быть сделаны с помощью непубличных свойств, и предотвращает ряд шаблонов общего использования для Propertes.

Я знаю, что вы можете создать закрытый элемент SetIsValid, который изменяет общее хранилище резервных копий, но это создаст противоречивый шаблон и добавит то, что в противном случае было бы шумом кода, если бы это не было необходимо.

Я что-то пропустил?


Редактировать: Да, я что-то пропустил

В данный момент я модифицирую чужой код и просто понимаю, что класс, с которым я боролся, реализовал интерфейс и произошел от базового класса. И я новичок в C # Вот что вызвало путаницу переопределения.

фактический класс выглядел так:

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

... где BaseField также реализовал интерфейс, но не реализовал набор.

Ответы [ 2 ]

33 голосов
/ 10 марта 2010

Это совершенно законно. Вам не нужно ключевое слово override (фактически оно не будет компилироваться), но ничто не мешает вам сделать это:

interface IField
{
    bool IsValid { get; }
}

class Field : IField
{
    public bool IsValid { get; protected set; }
}
6 голосов
/ 10 марта 2010

Это возможно на интерфейсах , но не на абстрактных / виртуальных свойствах - вы можете смешать эти два.

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