Вы смешали понятия о (new
, override
) и (property
, field
).
Я предоставлю некоторую информацию о них и сделаю свое предложение. Мое предложение относится к третьей части.
Если этот пост не отвечает на ваш вопрос, отредактируйте его, указав вариант использования.
new
не override
new
- это «скрыть» свойство / поле базового класса, которое НЕ переопределяет virtual
функции.
В итоге:
override
используется, когда необходимо изменить функцию virtual
базового класса или определить функцию abstract
.
Если дочерний класс вызывает функцию foo
базового класса, которая вызывает виртуальную функцию bar
, будет вызываться ДЕТСКАЯ версия bar
, а не базовая версия.
Для
new
,
Если дочерний класс вызывает функцию foo
базового класса, которая вызывает функцию bar
, будет вызываться БАЗОВАЯ версия bar
, а не дочерняя версия.
Я редко использую новую, поэтому не могу посоветовать, как ее использовать.
Ссылка Разница между новой и переопределенной
Поле нельзя переопределить.
public class foo
{
public double field; // This is field
public int property // This is property
{
get{ return 1 };
}
}
Свойство является оболочкой для функций получения / установки.
Свойство можно переопределить ( из-за # 1), но поля не могут быть переопределены.
Ref В чем разница между полем и свойством?
Предложение
Мне пришло в голову реализовать Value
как свойство object
public class foo
{
public virtual object Value
{
get; set;
}
}
Затем обернуть его в нужный тип, но это будет стоить коробка и распаковка .
Однако, если ваш случай не критичен к производительности, все в порядке.
public class bar : foo
{
public override object Value
{
get{ // something different
};
set{ // something different
};
}
public double DesiredValue
{
get{ return (double)Value };
}
}