has-a関係と多態性をどのように両立させればよいか

テーマ、知りたいこと

オブジェクト指向プログラミングにおいて、包含したクラスで多態性をどう実現するべきかどうかについて質問があります。

背景、状況

例としてキャラクターを表すクラスを設計を設計しました。
このキャラクターは、自身の持ち物を管理するInventoryクラスを包含(has a)しています。

CSharp

1public class Inventory2{3 private List<Item> _itemList = new List<Item>();4 public ReadOnlyCollection<Item> ReadOnlyItemList => _itemList.AsReadOnly();5 6 public void AddItem(Item item)7 {8 _itemList.Add(item);9 }10 11 public void RemoveItem(Item item)12 {13 _itemList.Remove(item);14 }15}16 17public class Character18{19 private Inventory _inventory = new Inventory();20 21 public void AddItem(Item item)22 {23 _inventory.AddItem(item);24 }25 26 public void RemoveItem(Item item)27 {28 _inventory.RemoveItem(item);29 }30}

また、アイテムを出し入れする宝箱など内部にインベントリを持つエンティティを表すクラスも設計することにしました。
宝箱も内部インベントリを管理するInventoryクラスを包含(has a)しています。

CSharp

1public class TreasureBox2{3 private Inventory _inventory = new Inventory();4 5 public void AddItem(Item item)6 {7 _inventory.AddItem(item);8 }9 10 public void RemoveItem(Item item)11 {12 _inventory.RemoveItem(item);13 }14}

この時、キャラクタークラスと宝箱クラスの間でポリモーフィズムを実現したいと考えました。
どちらも同じくインベントリを持つため、インベントリに関するメソッドを外部に向けて公開するインターフェイスを作成し、
キャラクタークラスと宝箱クラスに適用します。

CSharp

1public interface IInventoryHolder2{3 public void AddItem(Item item);4 public void RemoveItem(Item item);5}6 7public class Character : IInventoryHolder {}8 9public class TreasureBox : IInventoryHolder {}

しかしながら、このようにインターフェイスを使用して多態性を実現する方法が適切かどうか疑問に思いました。
キャラクターと宝箱という異なるクラスに対してどちらもインベントリを保持しているという点からインターフェイスを共通させることが適切か否かが判断できません。

まとめ

上記の例において多態性を表現するコーディングは適切なのでしょうか?
また、そもそもオブジェクト指向の作法に則る場合、包含されたクラスでどのように多態性を表現するべきなのでしょうか?

コメントを投稿

0 コメント