我可以重写在C#中的属性? 怎么样?
我有这个基类:
abstract class Base { public int x { get { throw new NotImplementedException(); } } }
和下面的后裔:
class Derived : Base { public int x { get { //Actual Implementaion } } }
当我编译时,我得到这个警告说派生类的x
的定义将隐藏它的基本版本。 是可以覆盖C#类似的方法的属性?
你需要使用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 { ... } } }
使基本属性抽象并覆盖或在派生类中使用new关键字。
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 } } }
abstract class Base { // use abstract keyword public virtual int x { get { throw new NotImplementedException(); } } }
更改属性签名,如下所示:
基础类
public virtual int x { get { /* throw here*/ } }
派生类
public override int x { get { /*overriden logic*/ } }
如果在Base类中不需要任何实现,只需使用抽象属性即可。
基础:
public abstract int x { get; }
衍生:
public override int x { ... }
我build议你使用abstract
属性,而不是在getter中实现NotImplementedexception, abstact
修饰符将强制所有的派生类来实现这个属性,所以你最终将得到编译时安全的解决scheme。
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... } }
两者之间的区别在于,抽象强制派生类实现某些内容,并且可以提供派生程序可以按原样使用或者改变的默认行为。
在你的派生类中,你不能这样做吗? 还没有尝试,只是想可能是…
public override int x { get; set; //Actual implementation }