Можно ли добавить метод доступа к свойству в .NET, переопределив его?

StackOverflow https://stackoverflow.com/questions/545562

Вопрос

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

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; }
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top