Можно ли переопределить свойство в c#? Как?
у меня есть этот базовый класс:
abstract class Base
{
public int x
{
get { throw new NotImplementedException(); }
}
}
и следующие потомки:
class Derived : Base
{
public int x
{
get { //Actual Implementaion }
}
}
когда я компилирую, я получаю это предупреждение о том, что определение производного класса x
собирается скрыть версию базы. Можно ли переопределить свойства в методах c# like?
5 ответов:
вы должны использовать
virtual
ключевое словоabstract class Base { // use virtual keyword public virtual int x { get { throw new NotImplementedException(); } } }
или определить абстрактное свойство:
abstract class Base { // use abstract keyword public abstract int x { get; } }
и использовать
override
ключевое слово, когда в ребенка:abstract class Derived : Base { // use override keyword public override int x { get { ... } } }
если вы не собираетесь переопределять, вы можете использовать
new
ключевое слово на методе, чтобы скрыть определение родителя.abstract class Derived : Base { // use override keyword public new int x { get { ... } } }
сделайте базовое свойство абстрактным и переопределите или используйте новое ключевое слово в производном классе.
abstract class Base { public abstract int x { get; } } class Derived : Base { public override int x { get { //Actual Implementaion } } }
или
abstract class Base { public int x { get; } } class Derived : Base { public new int x { get { //Actual Implementaion } } }
изменить подпись свойства, как показано ниже:
базовый класс
public virtual int x { get { /* throw here*/ } }
производный класс
public override int x { get { /*overriden logic*/ } }
Если вам не нужна реализация в базовом классе, просто используйте абстрактное свойство.
основание:
public abstract int x { get; }
производные:
public override int x { ... }
Я бы предложил вам использовать
abstract
свойство, а не trhowing NotImplemented исключение в getter,abstact
модификатор заставит все производные классы реализовать это свойство, поэтому вы получите безопасное решение во время компиляции.
abstract class Base { // use abstract keyword public virtual int x { get { throw new NotImplementedException(); } } }
abstract class Base { public virtual int x { get { throw new NotImplementedException(); } } }
или
abstract class Base { // use abstract keyword public abstract int x { get; } }
в обоих случаях вы должны написать в производном классе
public override int x { get { your code here... } }
разница между ними заключается в том, что с помощью abstract вы заставляете производный класс реализовывать что-то, а с virtaul вы можете предоставить поведение по умолчанию, которое производный может использовать как есть или изменить.