在继承类中初始化常量或其他字段的最佳方式是什么?我意识到在这个例子中有很多语法错误,但这是一个很好的例子来清楚地说明我正在做的事情.
public abstract class Animal { public abstract const string Name; // #1 public abstract const bool CanFly; public abstract double Price; // price is not const,because it can be modified public void Fly() { if (!CanFly) Debug.Writeln("{0}s can't fly.",Name); else Debug.Writeln("The {0} flew.",Name); } } public class Dog : Animal { public override const string Name = "Dog"; // #2 public override const bool CanFly = false; public override double Price = 320.0; } public class Bird : Animal { public override const string Name = "Bird"; public override const bool CanFly = true; public override double Price = 43.0; }
我要完成的几件事情
>基类必须分配这3个字段.
>理想情况下,我希望这些初始化的字段在类的顶部在一起,所以我可以看到我分配给每个类的常量,并在需要时更改它们.
> Name和CanFly字段无法更改.
我知道你可以在一个构造函数中初始化这些字段(如果你摆脱了const),但是不能保证被赋值.如果您将这些字段替换为属性,并覆盖它们,则仍需要初始化属性的后备字段.你如何实现这一点?
它抱怨的几个语法错误:
>修饰符’abstract’在字段上无效.尝试使用属性. (#1)
> const字段需要提供一个值(#1)
>修饰符’覆盖’对此项无效(#2)
解决方法
如果一个基类需要一个派生类提供的值,最常见的两种方法是:
要求在构造函数中:
public readonly double Price; protected BaseClass(double price) { this.Price = price; }
派生类必须将价格传递给构造函数:
public Derived() : base(32) { }
或者,使其成为抽象属性:
public abstract double Price { get; }
派生类必须提供一些返回值的方法(尽管它们在哪里得到它取决于派生类,这在许多情况下提供了更多的灵活性):
public override double Price { get { return 32; } }