2016-06-21 30 views
14

Ho base astratta Goods classe e classe Book ereditata.Ridondanza dei campi di classe astratta 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); 
    } 

} 

Dovrei scrivere title, barCode, price che esiste nella classe Goods due volte? Posso sostituire questo

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

con una costruzione meno ridondante?

+8

Solo una nota. Hai ** campi ** e non ** proprietà **. Le proprietà dovrebbero avere 'get' e/o' set'. –

+6

Utilizzare 'decimal' (o numeri interi) anziché' double' per rappresentare i prezzi. – CodesInChaos

+4

Vorrei prendere in considerazione la sostituzione della classe astratta con un'interfaccia. – CodesInChaos

risposta

17

No, questo codice non è ridondante. È necessario passare valori al costruttore Book e al costruttore base.

Vedo che assegni weight nel costruttore Book. Se lo desideri, puoi fare lo stesso per altri Title, BarCode e Price. Quindi il tuo costruttore Goods sarebbe vuoto. Ma Ciò significherebbe che ogni implementazione di Goods avrebbe dovuto farlo (che sarebbe una cosa negativa, se non v'è più la logica, allora semplice assegnazione) ..

+0

Non capisco. – ifooi

+8

Il tuo codice non è ridondante e non puoi abbreviare il tuo istruttore. Ecco come appare C# sintax. –

+0

Ok, grazie, vorrei saperne di più. Esempi con getter/setter. – ifooi

2

Devo scrivere titolo, codice a barre, prezzo che esistono nel Classe di merci due volte? Posso sostituire questo ... con una costruzione meno ridondante?

C'è no "ridondanza" in questo codice.

Questa è la dichiarazione del costruttore [metodo], che specifica gli argomenti necessari.

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

Questa è l'invocazione del costruttore della classe base, passando gli argomenti passati al questo costruttore.

: base(title, barCode, price) 

Questo è assolutamente necessario perché la classe base può solo essere costruito utilizzando il costruttore a condizione che prende tre argomenti. È necessario per fornire questi argomenti, sia da argomenti passati a questa funzione di costruzione o, eventualmente, da loro deriva, come in

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

(Non sono sicuro di come una tale funzione funzione avrebbe funzionato, ma, si spera, si vede il mio punto).

+0

Grazie. Invocaton. Ho capito in un'altra risposta ma grazie! Invocazione di parola. – ifooi