Добавить параметр, когда вы наследуете абстрактный класс? - PullRequest
0 голосов
/ 13 ноября 2018

Книжный класс наследует абстрактный класс Goods. Метод book имеет те же параметры, что и метод Goods. Но также есть numPages, почему это так?

публичная книга (строковое название, строковый штрих-код, двойная цена, int numPages)

Если бы у меня был класс, унаследованный от класса Book, нужно ли мне указывать все одинаковые параметры и создавать новый?

public Author (строковый заголовок, строковый barCode, двойная цена, int 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 голосов
/ 13 ноября 2018

Если бы у меня был класс, унаследованный от класса Book, нужно ли мне ставить все те же параметры и создавать новый?

Нет, нет необходимости, если класс Book может предоставить некоторые значения для конструктора класса Goods в начале конструктора.

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

Если нет другого способа, кроме как поместить те же параметры в конструктор подкласса.

Это потому что

Конструкторы экземпляров, которые вы вызываете для создания нового экземпляра класса. Каждый класс должен определять свои собственные конструкторы.

, что объясняется в Microsoft doc , и подкласс должен вызывать один из конструкторов, предоставленных базовым классом явно или неявно.

: base(title, barCode, price) в вашем коде явным образом. Даже если класс Book не имеет конструктора или имеет конструктор без параметров, вы можете сделать это неявным способом, где вы можете опустить код : base().

Еще одна вещь, которую вы могли бы рассмотреть, это избавиться от параметров конструктора, которые предназначены для необязательного поля. Такие поля могут быть заполнены как свойства. BarCode в приведенном ниже коде является примером. Тогда подклассу не нужно иметь код для BarCode.

Но, читая этот документ , следует помнить о порядке инициализации с помощью инициализатора объекта. В некоторых случаях он не может быть эквивалентным, хотя это и не имеет значения в предоставленном простом коде.

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;
    }
}
...