Можно ли добавить средство доступа к свойству в .NET, переопределив его? - PullRequest
4 голосов
/ 13 февраля 2009

Можно ли сделать что-то подобное?

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.

Текущий пример не компилируется, но, возможно, я что-то здесь упускаю.

Добавлено: Чтобы уточнить, нет, я не хочу переопределять с новым. Я хочу добавить новый аксессор. Я знаю, что это не было в базовом классе, поэтому его нельзя переопределить. Хорошо, позвольте мне объяснить, как это выглядело бы без синтаксического сахара:

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

Ответы [ 4 ]

1 голос
/ 13 февраля 2009

Нет, это невозможно. К сожалению, вы даже не можете переопределить и изменить уровень доступа (например, с protected на public ), как описано в MSDN . Я бы порекомендовал вам немного реструктурировать код / ​​класс и найти альтернативный способ решения этой задачи, такой как объявление метода доступа set с модификатором protected с использованием метода SetProperty в производном классе.

1 голос
/ 13 февраля 2009

Нет, нет способа сделать это. Подумайте о том, как обрабатывается синтаксический сахар вашей виртуальной собственности, то есть он преобразуется в:

public virtual string get_prop();

Нет метода set_Prop для переопределения, и вы не можете переопределить метод, который не существует.

0 голосов
/ 13 февраля 2009

Представляем новое поле, попахивает грязным. И в любом случае вам нужно быть осторожным, чтобы не нарушить полиморфизм и наследование (что, если базовый класс общается с частным полем?).

Что касается добавления нового средства доступа при переопределении; простой ответ «нет, ты не можешь». При переопределении вы можете воздействовать только на существующие средства доступа, поскольку именно это определено в виртуальной таблице для этого члена (переопределенный член все еще «принадлежит» базовому / декларирующему классу, а не переопределяющему классу). *

Один из вариантов (не идеальный) - повторно объявить свойство, но вам все равно понадобится способ поговорить с базовым классом. Так что если метод доступа в базовом классе был protected:

class A
{
    public string prop
    {
        get;
        protected set;
    }
}
class B : A
{
    public new string prop
    {
        get { return base.prop; }
        set { base.prop = value; }
    }
}
0 голосов
/ 13 февраля 2009

Вы можете скрыть реализацию базового класса, используя ключевое слово «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;
        }
    }
}
...