加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 06:42:17 所属栏目:百科 来源:网络整理
导读:在继承类中初始化常量或其他字段的最佳方式是什么?我意识到在这个例子中有很多语法错误,但这是一个很好的例子来清楚地说明我正在做的事情. public abstract class Animal { public abstract const string Name; // #1 public abstract const bool CanFly; p
在继承类中初始化常量或其他字段的最佳方式是什么?我意识到在这个例子中有很多语法错误,但这是一个很好的例子来清楚地说明我正在做的事情.
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;
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读