Редактировать: Оказывается, я упустил что-то очевидное, но я собираюсь оставить вопрос открытым, если кто-то другой совершит такую же очевидную ошибку. Спасибо тем, кто указал на это См. Объяснение внизу.
Можно ли установить непубличный набор для свойства, которое переопределяет свойство интерфейса?
Возможно, у меня тупой момент, но мне кажется, что наличие свойства, определенного в интерфейсе, подразумевает, что ни один производный класс не может предоставить какой-либо непубличный набор для указанного свойства.
Пример:
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 также реализовал интерфейс, но не реализовал набор.