1

私は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);
   .....
}

その後、RentalItem クラスを継承する MovieItem クラスを作成しました。このクラスには追加のフィールドがあります。以下のように :

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){};

しかし、実際には addItem メソッドを実装したいので、以下のように基本パラメーター + 追加パラメーターを取ります。

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

では、どのように抽象メソッドを使用できますか? そして、私が独自の addItem(...) メソッドを実装している場合、抽象クラスの使用は何ですか?

4

3 に答える 3

0

抽象クラスが機能するためには、メソッド シグネチャが同じままである必要があります。Movie クラスの addItem メソッドにさらにパラメーターがある場合は、そのシグネチャを List または Dictionary またはその他のコレクションを受け入れるように変更するか、RentalItemProperties という名前の新しいクラスにパラメーターをカプセル化することで対処できます。

于 2013-05-14T09:23:02.317 に答える
0

異なる 2 つのことを抽象化しようとしています。を追加することRentalItemは、を追加することと同じMovieItemですか? はいの場合は、メソッドを抽象化できます。それ以外の場合は、抽象化しない方がよいでしょう。

編集:

たぶん、私の発言は明確ではありません。このコードの例を見てください:

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

クラスでのAddItemメソッドの使用法です。RentalItem次に、MovieItem クラスについて:

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

今は問題なく見えます。ただし、MovieItemは に継承されているためRentalItem、次のように実装できます。

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

これが問題になります。は によって呼び出すことができず、両方のメソッドが異なるパラメーターを受け入れるため、MovieItem.AddItemは とは異なることがわかります。今何ができるでしょうか?RentalItem.AddItemRentalItem

まず、 が必要ない場合、または論理的に同じでない場合は、MovieItemを から継承した新しいクラスとして使用しRentalItemます。

次に、継承が必要な場合は、RentalItemMovieItemをメソッドではなくプロパティのみを持つエンティティのみにします。そして、AddItem を処理するために、 と のような別のクラスを作成しますRentalItemCollectionMovieItemCollectionこれは、ロジックでは互いに関係がありません。

于 2013-05-14T05:57:19.720 に答える