QA@IT

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

2693 PV

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#では多重継承は禁止です。

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

回答

これでいかがでしょう?

using System;

namespace SpaceInvaders
{
    class Tako : Enemy
    {
    }

    class Ika : Enemy
    {
    }

    class Ufo : Enemy
    {
        public override void Shoot()
        {
            Console.WriteLine("撃たない");
        }
    }

    abstract class Enemy
    {
        public virtual void Move()
        {
            Console.WriteLine("動く");
        }

        public virtual void Shoot()
        {
            Console.WriteLine("撃つ");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("\nたこ:");
            Tako tako = new Tako();
            tako.Move();
            tako.Shoot();

            Console.WriteLine("\nいか:");
            Ika ika = new Ika();
            ika.Move();
            ika.Shoot();

            Console.WriteLine("\nUFO:");
            Ufo ufo = new Ufo();
            ufo.Move();
            ufo.Shoot();

            Console.WriteLine("\n何かキーを押して下さい");
            Console.ReadKey();
        }
    }
}
編集 履歴 (0)

いあ、馬鹿な質問をしました。
共通クラスふやせばいいだけですね。

板を汚してしまい、失礼しました。

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。