我可以重写在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 }