2016-06-21 7 views
14

Ich habe Basis abstrakt Goods Klasse und vererbt Book Klasse.Abstrakte Klassenfelder Redundanz 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); 
    } 

} 

Soll ich schreiben title, barCode, price, die zweimal in der Goods Klasse existieren? Kann ich das ersetzen

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

mit weniger redundante Konstruktion?

+8

Nur eine Anmerkung. Sie haben ** Felder ** und nicht ** Eigenschaften **. Eigenschaften sollten 'get' und/oder' set' haben. –

+6

Bitte verwenden Sie 'decimal' (oder Integer) anstelle von' double', um Preise darzustellen. – CodesInChaos

+4

Ich würde überlegen, die abstrakte Klasse durch eine Schnittstelle zu ersetzen. – CodesInChaos

Antwort

17

Nein, dieser Code ist nicht redundant. Sie müssen Werte sowohl an den Konstruktor Book als auch an den Konstruktor base übergeben.

Ich sehe Sie zuweisen weight in Book Konstruktor. Wenn Sie möchten, können Sie auch für andere Title, BarCode und Price dasselbe tun. Dann wäre Ihr Goods Konstruktor leer. Aber das würde bedeuten, dass jede Implementierung von Goods wäre es zu tun hat (das ist eine schlechte Sache wäre, wenn es mehr Logik dann einfach assign ist) ..

+0

Nicht verstanden. – ifooi

+8

Ihr Code ist nicht redundant und Sie können Ihren Konstruktor nicht kürzer machen. So sieht C# sintax aus. –

+0

Ok, Danke, ich würde mehr lernen. Beispiele mit Getter/Setter. – ifooi

2

Soll ich schreiben Titel, barcode, Preis, gibt es in der Warenklasse zweimal? Kann ich das ersetzen ... mit weniger redundanter Konstruktion?

In diesem Code gibt es keine "Redundanz".

Dies ist die Deklaration Ihres Konstruktors [Methode], die die Argumente angibt, die er benötigt.

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

Dies ist der Aufruf der Basisklasse Konstruktor, die auf diesen Konstruktor übergebenen Argumente übergeben.

: base(title, barCode, price) 

Dies ist unbedingt notwendig, da Ihre Basisklasse kann nur konstruiert werden den Konstruktor zur Verfügung gestellt, das drei Argumente annimmt. Sie diese Argument zu liefern, entweder von Argumenten zu diesem Konstruktor übergeben oder, möglicherweise, indem sie ableiten, wie in

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

(Nicht sicher, wie eine solche Funktion Funktion funktionieren würde, aber hoffentlich Sie sehen, meine Punkt).

+0

Danke. Invokaton. Ich habe es in einer anderen Antwort verstanden, aber danke! Wortaufruf – ifooi