继承抽象类时添加参数?

时间:2018-11-13 02:32:14

标签: c# variables inheritance abstract base

Book类继承了Goods抽象类。 Book方法的参数与Goods方法的参数相同。但是还有numPages,为什么?

公共书(字符串标题,字符串条形码,双倍价格,整数numPages)

如果我有一个继承Book类的类,是否必须将所有相同的参数都放入一个新的参数中?

公共作者(字符串标题,字符串条形码,双倍价格,整数numPages,字符串作者)

我希望这有道理。

  abstract class Goods
    {
        public decimal weight; 
        string Title, BarCode;
        double Price;
        public Goods(string title, string barCode, double price)
        {
            Title = title;
            BarCode = barCode;
            Price = price;
        }
    }

    abstract class Book : Goods
    {
        protected int NumPages;
        public Book(string title, string barCode, double price, int numPages)
            : base(title, barCode, price)
        {
            NumPages = numPages;
            weight = 1;
        }

1 个答案:

答案 0 :(得分:0)

  

如果我有一个继承Book类的类,是否必须将所有相同的参数都放入一个新的参数中?

否,如果Book类可以在构造函数的开头为Goods类构造函数提供一些值,则不必这样做。

public Book(string title, double price, int numPages)
    : base(title, price, 100) {

除非将相同的参数放在子类的构造函数中,否则别无选择。

这是因为

  

实例构造函数,您可以调用它们来创建类的新实例。每个类都必须定义自己的构造函数。

{p>(在Microsoft doc中有解释),子类必须显式或隐式调用基类提供的构造函数之一。

代码中的

: base(title, barCode, price)是显式方式。即使Book类没有构造函数或没有参数的构造函数,也可以采用隐式方式,其中可以省略代码: base()

您可以考虑的另一件事是摆脱用于可选字段的构造函数参数。可以将此类字段填充为属性。以下代码中的BarCode是示例。然后,子类不需要具有BarCode的代码。

但是请阅读this doc,请充分了解对象初始化程序的初始化顺序。在某些情况下,虽然在所提供的简单代码中没关系,但这不是等效的。

abstract class Goods {
    public decimal weight;
    string Title, GoodsType;
    public string BarCode { get; set; }
    double Price;
    public Goods(string title, double price) {
        Title = title;
        GoodsType = goodsType;
        Price = price;
    }
}

class Book : Goods {
    protected int NumPages;
    public Book(string title, double price, int numPages)
        : base(title, price) {
        NumPages = numPages;
        weight = 1;
    }
}