2013-05-14 58 views
1

我實現圖書館系統鍛鍊,因爲我已經創建了一個抽象類:如何以適當的方式使用抽象方法?

public abstract class RentalItem 
{ 
    ..... 
    public RentalItem() { } 
    public RentalItem(string itemID, string title, int qty,float price, PeriodType period) { 
     ItemID = itemID; 
     Title = title; 
     No_Of_Copies = qty; 
     Period = period; 
    } 
    public abstract void addItem(string itemId, string title, int no_of_copies,float price,PeriodType p); 
    ..... 
} 

之後,我已經創建MovieItem類,它繼承了RentalItem類: 現在這個類有額外的字段。如下圖所示:

public Movie(string itemId, string title, int no_of_copies, float price, PeriodType p, MovieType type, string actor, string director) 
     : base(itemId, title, no_of_copies, price, p) 
    { 

     this.Type = type; 
     this.Actors = actor; 
     this.Director = director; 
    } 


public override void addItem(string itemId, string title, int no_of_copies,float price,PeriodType p){}; 

但actully我想要實現AddItem方法這樣了,它需要的基礎參數+其他參數如下:

public void addItem(string itemId, string title, int no_of_copies, float price, PeriodType p, MovieType type, string actor, string director) 

因此,如何我可以用抽象方法?如果我正在實現我自己的addItem(...)方法,那麼什麼是抽象類的使用?

回答

0

當使用抽象方法時,必須重寫該方法,這意味着您必須遵守抽象方法的原始簽名。您不能添加或刪除原始簽名中的參數。 如果您需要更改簽名,則不適合使用抽象方法

+0

是的,我明白這一點,所以在我的情況下,抽象類中定義Abstract方法沒有任何意義。對? – 2013-05-14 05:57:01

0

您試圖抽象2個不同的內容。是否加入RentalItem與添加MovieItem相同?如果是,那麼你可以抽象該方法。否則,最好不要抽象它。

編輯:

也許我不清楚我的發言。現在來看看這個例子代碼:

RentalItem rent = new RentalItem(); 
rent.AddItem(..params); 

AddItem方法在RentalItem類的用法。現在對於MovieItem類:

MovieItem mv = new MovieItem(); 
mv.AddItem(..params); 

現在看起來不錯。然而,由於MovieItemRentalItem繼承,我們可以這樣實現:

RentalItem item = new MovieItem(); 
item.AddItem(..params); 

這個問題來了。我們可以看到MovieItem.AddItemRentalItem.AddItem不同,因爲它不能被RentalItem調用,並且兩種方法都接受不同的參數。現在我們可以做什麼?

首先,如果不需要或者如果邏輯上不相同,則讓MovieItem作爲一個新類而不是繼承自RentalItem。其次,如果你需要繼承,讓RentalItemMovieItem成爲只有屬性而不是方法的實體。爲了處理AddItem,你創建了另一個類,如RentalItemCollectionMovieItemCollection,它們在邏輯上沒有關係。

+0

其實,MovieItem是RentalItem。所以,我試圖給MovieItem添加常見的行爲,比如添加,編輯,刪除和更新方法,這些子類必須實現。但正如我所提到的,MovieItem增加了RentalItem +它自己的參數在一行中並寫入文件。 – 2013-05-14 06:07:30

+0

我已經更新了我的答案 – Fendy 2013-05-14 06:17:20

0

方法簽名必須保持相同才能使抽象類正常工作。 如果Movie類的addItem方法具有更多參數,則可以通過更改其簽名來接受List或Dictionary或其他集合來處理該問題,也可以將參數封裝在名爲RentalItemProperties的新類中。