3

内部にメソッドBagがある がある状況にいます。AddSlot2 種類のバッグがItemsBagあり、DCBag(ドラッグ可能なコンテンツの略) ItemsBagは行と列があることを意味する 2D バッグであり、DCBag1D であり、列は 1 つだけですが行は多数あります (つまり、2D と見なすこともできます)。

AddSlot問題は、最初のバッグが 2D インデックスを扱うため、署名を次のようにしたいということです。

public void AddSlot(int r, int c);

そして他のバッグのAddSlot

public void AddSlot(int r);

上記の方法で署名をオーバーライドできるようにAddSlot、仮想/抽象署名を作成するにはどうすればよいですか?BagItemsBagDCBagBag

私が言ったように、DCBagも 2D であると見なすことができるので、 と の両方ItemsBagが同じ署名を持っていますが、これができるかどうかを本当に知りたいです。それは非常に興味深いことです。

可変数の引数を使用してparams obejct[] args回避できますが、ボックス化/ボックス化解除を伴わない方法で行うとよいでしょう。

また、 aTwoDimBagOneDimBag作成して両方を から継承させBag、 の定義をAddSlot好きなように記述してから、 ItemsBaginheritTwoDimBagDCBaginheritを作成することもできますが、現在OneDimBagの状態を達成する方法以上の回避策を探しているわけではありません。要求する。

もう一度要約すると、継承する子で上書きできる署名をどのように書くことができますか? (つまり、私ができるなら、方法がある)

ありがとう。

編集: (追加情報)Bagには多くの機能があります。2 つのバッグの違いは、スロット ( ) の 2 次元リストを保持ItemsBagするのに対して、 の 1 次元List<List<Slot>>を保持することです。を保持しているのはです。- の項目は複数の場合がありますが、 の項目は1 つのみです。DCBagListSlotSlotItemItemsBagSlotDCBag

両方のバッグでできることのいくつか: AddSlot, FreeSlot, AddItem(追加戦略が異なります。追加の追加方法もありますItemsBag)、両方のバッグで、マウスでアイテムをピックアップしたり、アイテムを交換したり、アイテムを並べ替えたりできます。両方のバッグも受け取ることができます次のような必要なアクションを実行するためのスロットからの通知Notify_ClickedOnEmptySlot(Slot slot)

でしかできないことのいくつかItemsBag: アイテムの結合、スロットの列の追加、スロットの列の追加、アイテムの回転。

バッグの外観の違いは次のとおりですItemsBag(これは古いデモです)。

ここに画像の説明を入力

DCBag:

ここに画像の説明を入力

4

2 に答える 2

0

基本クラスでこのメソッドを指定し、オプションのパラメーターを使用できます。

public void AddSlot(int r, int c = 0)
{
}

次に、このように呼び出すと。

itemsBag.AddSlot(1, 1);
dcBag.AddSlot(1);

そして、おっしゃる通りどちらも二次元なので、同じように扱えますよね?

アップデート:

コメントに基づいて、基本クラスでも定義します

private abstract void AddSlotInternally(int r, int c);

これをオーバーライドする必要があるため、バッグの特定の動作を定義します。

public void AddSlot(int r, int c = 0)
{
    AddSlotInternally(r, c);
}

他の開発者が理解できないほど、このソリューションが悪いとは思いません。ジェネリックは、単純な基本メソッドよりも紛らわしい場合があります。

于 2013-08-28T08:09:26.853 に答える