2016-06-21 8 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); 
    } 

} 

私が書く必要がありますtitlebarCode、二回Goodsクラスに存在しprice?これを置き換えることはできますか

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

+8

ちょうどメモ。 **フィールド**を持っていて、**プロパティ**はありません。プロパティには 'get'や' set'が必要です。 –

+6

価格を表すには 'double'の代わりに' decimal'(または整数)を使用してください。 – CodesInChaos

+4

抽象クラスをインタフェースで置き換えることを検討したいと思います。 – CodesInChaos

答えて

17

いいえ、このコードは冗長ではありません。コンストラクタBookとコンストラクタbaseの両方に値を渡す必要があります。

weightBookコンストラクタに割り当てます。必要に応じて、他のTitleBarCode、およびPriceについても同じことを行うことができます。その後、Goodsコンストラクタは空になります。しかし、それは

+0

わかりません。 – ifooi

+8

あなたのコードは冗長ではなく、コンストラクタを短くすることはできません。これがC#sintaxの外観です。 –

+0

ありがとう、私はもっと学ぶだろう。 getter/setterの例 – ifooi

2

は私がタイトルを書く必要があります。.. Goodsの各実装は(より多くのロジック、単純な割り当てがある場合は悪いことだろう)それをしなければならないということを意味します、バーコード、価格に存在しています商品クラスは2回ですか? これを交換することはできますか?

このコードでは「冗長性」があります。

あなたのコンストラクタ[メソッド]の宣言で、引数を指定します。

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

これは、このコンストラクタに渡される引数を渡し、基底クラスのコンストラクタの呼び出しです。

: base(title, barCode, price) 

お使いのベースクラスがのみ3つの引数を取るコンストラクタ提供を使用して構築することができるので、これは絶対に必要です。あなたは、このような機能の機能がどのように動作するか確認してください(

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

のように、それらを導出することで、どちらかの可能性がこのコンストラクタに渡された引数または、から、これらの引数を未提供するを持ってたが、うまくいけば、あなたは私を見ますポイント)。

+0

ありがとうございます。 Invocaton。私は別の答えで理解したが、ありがとう! Wordの呼び出し。 – ifooi