2016-06-21 2 views
14

У меня есть базовый аннотация Goods класс и унаследованный Book класс.Абстрактные поля классов избыточности C#

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) 

с менее избыточной конструкцией?

+8

Просто примечание. У вас есть ** поля **, а не ** свойства **. Свойства должны иметь 'get' и/или' set'. –

+6

Пожалуйста, используйте 'decimal' (или integers) вместо' double' для представления цен. – CodesInChaos

+4

Я бы подумал о замене абстрактного класса на интерфейс. – CodesInChaos

ответ

17

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

Я вижу, что вы назначаете weight в Book конструктор. Если вы хотите, вы можете сделать то же самое для других Title, BarCode и Price. Тогда ваш конструктор Goods будет пустым. Но это означало бы, что каждая реализацию Goods бы сделать это (что было бы плохо, если есть больше логики, то просто правопреемник) ..

+0

Don не понимает. – ifooi

+8

Ваш код не является избыточным, и вы не можете сделать ваш контора короче. Вот как выглядит C# sintax. –

+0

Хорошо, спасибо, я бы узнал больше. Примеры с геттером/сеттером. – ifooi

2

Должен ли я писать название, штрих-код, цена, которые существуют в Класс товаров в два раза? Могу ли я заменить это ... с менее избыточной конструкцией?

В этом коде есть no «избыточность».

Это объявление вашего конструктора [method], определяющее аргументы, которые он принимает.

public Book(string title, string barCode, double price, int numPages) 

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

: base(title, barCode, price) 

Это абсолютно необходимо, потому что ваш базовый класс может только быть построен с помощью конструктора при условии, что принимает три аргумента. Вы должны предоставить эти аргументы, либо из аргументов, переданных в этот конструктор или, возможно, путем их вывода, как в

: base(title, barCode, priceDerivedFrom(title, barCode)) 

(Не знаю, как такая функция функция будет работать, но, надеюсь, вы видите мой точка).

+0

Спасибо. Инвольтация. Я понял в другом ответе, но спасибо! Вызов слова. – ifooi