2009-02-13 7 views
4

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

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

Re edit - простой ответ: нет. –

+0

Отредактируйте это в своем ответе, и я приму его. :) –

ответ

1

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

1

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

public virtual string get_prop(); 

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

+0

Правда, но я могу добавить новый виртуальный метод, не так ли? –

+0

не уверен, что вы имеете в виду, но вы можете добавить виртуальный метод как свойство «set», которое будет преобразовано в метод виртуальных множеств ... – ng5000

0

Вы можете скрыть реализацию базового класса, используя ключевое слово «новое» в производном классе. Должно быть выполнено следующее компиляция:

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

Представляя другое фоновое поле, как правило, рискованно, хотя ... из черно- box, класс A может иметь поле и т. д. в качестве основной реализации, и любое использование этого поля было бы подозрительным ... –

+0

Согласитесь, я не люблю этот код ... –

0

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

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

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

class A 
{ 
    public string prop 
    { 
     get; 
     protected set; 
    } 
} 
class B : A 
{ 
    public new string prop 
    { 
     get { return base.prop; } 
     set { base.prop = value; } 
    } 
}