Могу ли я переопределить свойство в С#? Как?
У меня есть этот базовый класс:
abstract class Base
{
public int x
{
get { throw new NotImplementedException(); }
}
}
И следующий потомок:
class Derived : Base
{
public int x
{
get { //Actual Implementaion }
}
}
Когда я компилирую, я получаю это предупреждение, говоря, что определение Derived класса x
будет скрывать базовую версию. Возможно ли переопределить свойства в С#-подобных методах?
Ответы
Ответ 1
Вам нужно использовать ключевое слово 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 { ... } }
}
Ответ 2
Сделать базовое свойство абстрактным и переопределить или использовать новое ключевое слово в производном классе.
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 }
}
}
Ответ 3
Изменить подпись свойства, как показано ниже:
Базовый класс
public virtual int x
{ get { /* throw here*/ } }
Производный класс
public override int x
{ get { /*overriden logic*/ } }
Если вам не нужна реализация в базовом классе, просто используйте абстрактное свойство.
Base:
public abstract int x { get; }
Производное:
public override int x { ... }
Я предлагаю вам использовать свойство abstract
, а не trhowing исключение NotImplemented в getter, модификатор abstact
заставит все производные классы реализовать это свойство, чтобы вы в конечном итоге нашли решение, безопасное для компиляции.
Ответ 4
abstract class Base
{
// use abstract keyword
public virtual int x
{
get { throw new NotImplementedException(); }
}
}
Ответ 5
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... }
}
разница между двумя заключается в том, что с абстрактным вы вынуждаете производный класс реализовывать что-то, и с помощью virtaul вы можете предоставить поведение по умолчанию, которое деривер может использовать как есть или изменить.