QA@IT
«質問へ戻る

質問を投稿

このような場合オブジェクト指向でどのように解決すればいいのか?

C#で「多重継承するか」or「インターフェースに具体的な処理を実装したくなる」ような設計になり、どのように解決すればいいかわからず質問させいいただきました。

現在の状況をインベーダーゲームに例えて説明させていただきます。
インベーダーの敵を作っています。
この敵というのは、タコやイカ、UFO等がいます。
これらの敵に共通する処理として、横に自動的に動くという事があげられます。
そこでこれらの敵の共通処理を実装するために、Enemyクラスを実装し、そこに処理を書いて、これを継承することでDRY原則を守りました。
コードでいうとこんな感じです。

public class Tako:Enemy{
}

public class Ika:Enemy{
}

public class Ufo:Enemy{
}

public abstract class Enemy{
        void move{
        }
}

次に、タコとイカに弾を撃つという共通する処理を加えたくなりました。ただし、Ufoは弾をうちません。
この場合、Enemyに弾をうつという処理を書いてしまうと、Ufoも弾が撃てる様になります。
しかし、InterfaceでShot等とかいても、Interfaceには具体的な処理を記述できないです。
そしてC#では多重継承は禁止です。

どうすれば今回の様な問題を解決できるでしょうか?
ご回答いただけると助かります。

C#で「多重継承するか」or「インターフェースに具体的な処理を実装したくなる」ような設計になり、どのように解決すればいいかわからず質問させいいただきました。

現在の状況をインベーダーゲームに例えて説明させていただきます。
インベーダーの敵を作っています。
この敵というのは、タコやイカ、UFO等がいます。
これらの敵に共通する処理として、横に自動的に動くという事があげられます。
そこでこれらの敵の共通処理を実装するために、Enemyクラスを実装し、そこに処理を書いて、これを継承することでDRY原則を守りました。
コードでいうとこんな感じです。

```csharp
public class Tako:Enemy{
}

public class Ika:Enemy{
}

public class Ufo:Enemy{
}

public abstract class Enemy{
        void move{
        }
}
```

次に、タコとイカに弾を撃つという共通する処理を加えたくなりました。ただし、Ufoは弾をうちません。
この場合、Enemyに弾をうつという処理を書いてしまうと、Ufoも弾が撃てる様になります。
しかし、InterfaceでShot等とかいても、Interfaceには具体的な処理を記述できないです。
そしてC#では多重継承は禁止です。

どうすれば今回の様な問題を解決できるでしょうか?
ご回答いただけると助かります。