您应该将问题标题更改为详细说明您的问题仅与覆盖抽象属性有关,或者您的问题通常与覆盖类的 get-only 属性有关。
如果前者(覆盖抽象属性)
那个代码没用。单独的基类不应该告诉您您被迫覆盖 Get-Only 属性(可能是接口)。基类提供可能需要来自实现类的特定输入的通用功能。因此,通用功能可能会调用抽象属性或方法。在给定的情况下,常见的功能方法应该要求您覆盖抽象方法,例如:
public int GetBar(){}
但是如果你无法控制它,并且基类的功能从它自己的公共属性中读取(奇怪),那么就这样做:
public abstract class BaseClass
{
public abstract int Bar { get; }
}
public class ConcreteClass : BaseClass
{
private int _bar;
public override int Bar
{
get { return _bar; }
}
public void SetBar(int value)
{
_bar = value;
}
}
我想指出(奇怪的)评论:我想说一个最佳实践是让一个类不使用它自己的公共属性,而是在它们存在时使用它的私有/受保护字段。所以这是一个更好的模式:
public abstract class BaseClass {
protected int _bar;
public int Bar { get { return _bar; } }
protected void DoBaseStuff()
{
SetBar();
//Do something with _bar;
}
protected abstract void SetBar();
}
public class ConcreteClass : BaseClass {
protected override void SetBar() { _bar = 5; }
}
如果是后者(覆盖类的 get-only 属性)
每个非抽象属性都有一个 setter。否则它是无用的,你不应该关心使用它。微软不必让你做你想做的事。原因是:setter 以某种形式存在,你可以轻松地完成你想要的 Veerryy。
基类或任何您可以使用 读取属性的类都{get;}
具有某种针对该属性的公开设置器。元数据将如下所示:
public abstract class BaseClass
{
public int Bar { get; }
}
但是实现将具有复杂性的两端:
最简单的:
public abstract class BaseClass
{
private int _bar;
public int Bar {
get{
return _bar;
}}
public void SetBar(int value) { _bar = value; }
}
最复杂的:
public abstract class BaseClass
{
private int _foo;
private int _baz;
private int _wtf;
private int _kthx;
private int _lawl;
public int Bar
{
get { return _foo * _baz + _kthx; }
}
public bool TryDoSomethingBaz(MyEnum whatever, int input)
{
switch (whatever)
{
case MyEnum.lol:
_baz = _lawl + input;
return true;
case MyEnum.wtf:
_baz = _wtf * input;
break;
}
return false;
}
public void TryBlowThingsUp(DateTime when)
{
//Some Crazy Madeup Code
_kthx = DaysSinceEaster(when);
}
public int DaysSinceEaster(DateTime when)
{
return 2; //<-- calculations
}
}
public enum MyEnum
{
lol,
wtf,
}
我的观点是,无论哪种方式,你都暴露了二传手。在您的情况下,您可能想要覆盖int Bar
,因为您不希望基类处理它,无权查看它是如何处理它的,或者被要求违背您的意愿对一些代码进行真正的快速'n'dirty .
在后者和前者(结论)
长话短说:微软没有必要改变任何东西。您可以选择如何设置实现类,并且在没有构造函数的情况下,使用全部或不使用基类。