如何覆盖摘要属性?
How to Override abstract Property?
public abstract class SampleA
{
public abstract string PropertyA {get;set;}
}
如何覆盖抽象 PropertyA?
当您覆盖 属性 时,您应该同时编写 get
和 set
。在您的情况下,您创建了 a new 属性 具有相同的名称但具有另一个签名。
您正试图用字段
覆盖属性
属性通过 get
和 set
值访问器提供对字段的访问。请阅读 this 以更好地理解差异。因此,由于它们不相同,您的 IDE 建议您使用 new
-关键字隐藏父级 属性。
If you want to know why the new
Keyword didn't work in your case, read this.
改进您的设计
在你的问题中,你的代码中的 PropertyA
似乎需要设置为继承 类,但不能从外部更改。所以也许可以这样做:
public abstract class SampleA
{
// no setter -> cant be changed after initialization
public abstract string PropertyA { get; }
// protected setter -> can only be changed from inside SampleA or Sample
public abstract string PropertyB { get; protected set; }
}
public class Sample : SampleA
{
public override string PropertyA { get; } = "override";
public override string PropertyB { get; protected set; } = "override";
}
您当前的设计是如何完成的
这样做:
public class Sample : SampleA
{
public override string PropertyA { get; set; } = "override";
}
甚至用更多的行为来实现它:
public class Sample : SampleA
{
private string _propertyA = "override";
public override string PropertyA
{
get { return _propertyA; }
set
{
// Maybe do some checks here
_propertyA = value;
}
}
}
public abstract class SampleA
{
public abstract string PropertyA {get;set;}
}
如何覆盖抽象 PropertyA?
当您覆盖 属性 时,您应该同时编写 get
和 set
。在您的情况下,您创建了 a new 属性 具有相同的名称但具有另一个签名。
您正试图用字段
覆盖属性属性通过 get
和 set
值访问器提供对字段的访问。请阅读 this 以更好地理解差异。因此,由于它们不相同,您的 IDE 建议您使用 new
-关键字隐藏父级 属性。
If you want to know why the
new
Keyword didn't work in your case, read this.
改进您的设计
在你的问题中,你的代码中的 PropertyA
似乎需要设置为继承 类,但不能从外部更改。所以也许可以这样做:
public abstract class SampleA
{
// no setter -> cant be changed after initialization
public abstract string PropertyA { get; }
// protected setter -> can only be changed from inside SampleA or Sample
public abstract string PropertyB { get; protected set; }
}
public class Sample : SampleA
{
public override string PropertyA { get; } = "override";
public override string PropertyB { get; protected set; } = "override";
}
您当前的设计是如何完成的
这样做:
public class Sample : SampleA
{
public override string PropertyA { get; set; } = "override";
}
甚至用更多的行为来实现它:
public class Sample : SampleA
{
private string _propertyA = "override";
public override string PropertyA
{
get { return _propertyA; }
set
{
// Maybe do some checks here
_propertyA = value;
}
}
}