Можно ли добавить метод доступа к свойству в .NET, переопределив его?
-
23-08-2019 - |
Вопрос
Можно ли сделать что-то подобное?
class A
{
public virtual string prop
{
get
{
return "A";
}
}
}
class B: A
{
private string X;
public override string prop
{
get
{
return X;
}
set
{
X = value;
}
}
}
То есть базовый класс предоставляет виртуальное свойство только с помощью метода доступа GET, но дочерний класс переопределяет GET и также предоставляет SET.
Текущий пример не компилируется, но, возможно, я что-то упускаю.
Добавлен: Чтобы уточнить: нет, я не хочу переопределять с помощью new.Я хочу добавить новый аксессуар.Я знаю, что этого не было в базовом классе, поэтому его нельзя переопределить.Хорошо, позвольте мне попытаться объяснить, как это будет выглядеть без синтаксического сахара:
class A
{
public virtual string get_prop()
{
return "A";
}
}
class B: A
{
private string X;
public override string get_prop()
{
return X;
}
public virtual string set_prop()
{
X = value;
}
}
Решение
Нет, это невозможно.К сожалению, вы не можете даже переопределить и изменить уровень доступа (с защищенный к общественный например), как описано в MSDN.Я бы рекомендовал вам рассмотреть возможность небольшой реструктуризации кода/класса и поискать альтернативный способ выполнения этой задачи, например объявление метода доступа set с помощью защищенный модификатор с помощью метода SetProperty в производном классе.
Другие советы
Нет, нет никакого способа сделать это.Подумайте о том, как обрабатывается синтаксический сахар вашей виртуальной собственности, т.е.он преобразуется в:
public virtual string get_prop();
Не существует метода set_Prop, который можно было бы переопределить, и вы не можете переопределить несуществующий метод.
Вы можете скрыть реализацию базового класса, используя ключевое слово new в производном классе.Следующее должно скомпилироваться успешно:
class A
{
public virtual string prop
{
get
{
return "A";
}
}
}
class B : A
{
private string X;
public new string prop
{
get
{
return X;
}
set
{
X = value;
}
}
}
Представлять новую область деятельности — это что-то беспорядочное.И в любом случае вам нужно быть осторожным, чтобы не нарушить полиморфизм и наследование (что, если базовый класс обращается к частному полю?).
Что касается добавления нового аксессора при переопределении;простой ответ: «нет, ты не можешь».Когда вы переопределяете, вы можете повлиять только на существующие методы доступа, поскольку это то, что определено в виртуальной таблице для члена (переопределенный член по-прежнему «принадлежит» базовому/объявляющему классу, а не переопределяющему классу).
Один из вариантов (не идеальный) — повторно объявить свойство, но вам все равно понадобится способ поговорить с базовым классом.Итак, если метод доступа в базовом классе был protected
:
class A
{
public string prop
{
get;
protected set;
}
}
class B : A
{
public new string prop
{
get { return base.prop; }
set { base.prop = value; }
}
}