Абстрактная избыточность полей классов С#
У меня есть базовый абстрактный класс Goods
и унаследованный класс Book
.
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;
}
public override void display()
{
base.display();
Console.WriteLine("Page Numbers:{0}", NumPages);
}
}
Должен ли я писать title
, barCode
, price
, которые существуют в классе Goods
дважды? Могу ли я заменить этот
public Book(string title, string barCode, double price, int numPages)
: base(title, barCode, price)
с менее избыточной конструкцией?
Ответы
Ответ 1
Нет, этот код не является избыточным. Вы должны передать значения как конструктору Book
, так и конструктору base
.
Я вижу, что вы назначаете weight
в конструкторе Book
. Если вы хотите, вы можете сделать то же самое для других Title
, BarCode
и Price
. Тогда ваш конструктор Goods
будет пустым. Но это означало бы, что каждая реализация Goods
должна была бы сделать это (что было бы плохо, если было бы больше логики, чем просто назначить).
Ответ 2
Должен ли я писать заголовок, штрих-код, цену, которая существует в классе товаров дважды? Могу ли я заменить это... с менее избыточной конструкцией?
В этом коде нет "избыточности".
Это объявление вашего конструктора [method], определяющее аргументы, которые он принимает.
public Book(string title, string barCode, double price, int numPages)
Это вызов конструктора базового класса, передающий аргументы, переданные этому конструктору.
: base(title, barCode, price)
Это абсолютно необходимо, потому что ваш базовый класс можно построить только с помощью конструктора, который принимает три аргумента. Вы должны предоставить этот аргумент либо из аргументов, переданных этому конструктору, либо, возможно, путем их получения, как в
: base(title, barCode, priceDerivedFrom( title, barCode ) )
(Не знаю, как будет работать такая функция, но, надеюсь, вы увидите мою точку зрения).