c# – 在继承的类中初始化字段

前端之家收集整理的这篇文章主要介绍了c# – 在继承的类中初始化字段前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在继承类中初始化常量或其他字段的最佳方式是什么?我意识到在这个例子中有很多语法错误,但这是一个很好的例子来清楚地说明我正在做的事情.
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;
    }
}

猜你在找的C#相关文章