4

ローグライクゲームをプロジェクトとしてコーディングする必要がありますが、少し問題があります。スイッチを使用して作成するオブジェクトを選択する必要がある場合があります。スイッチの外部で「空の」オブジェクトを宣言したいのですが、スイッチはオブジェクトに値を入力します。これは私がやりたいことの一種です:

Console.WriteLine("What race would you like to be?")

int answer = Convert.ToInt32(Console.ReadLine());

Object heroRace; // This is where the problem comes in

switch(answer)
{
    case 1: heroRace = new Orc(); break;
    case 2: heroRace = new Elf(); break;
}

heroRace再利用のためにスイッチの範囲外になりたい。そのようなものを作成できれば、プログラムが大幅に簡素化されます。

4

3 に答える 3

4

オブジェクトのメンバーにアクセスする前に、オブジェクトをより具体的な型にキャストする必要があります

Object o=new Orc();
((Orc)o).methodNameWithinOrc();

ただし、これによりキャスト例外が発生する可能性があります。

例えば..

  ((Elf)o).methodNameWithinOrc();

はnotoのオブジェクトであるため、キャスト例外が発生します。OrcElf

is演算子を使用してキャストする前に、オブジェクトが特定のクラスに属しているかどうかを確認することをお勧めします

 if(o is Orc)
((Orc)o).methodNameWithinOrc();

ObjectToString, GetHashCode.. メソッドをオーバーライドしない限り、それ自体は役に立ちません

次のようになるはずです

 LivingThingBaseClass heroRace;

OrcElfのサブクラスである必要がありますLivingThingBaseClass

LivingThingBaseClass、、などmoveのメソッドを含めることができます..これらのメソッドのすべてまたは一部は、およびによってオーバーライドされますspeakkillOrcElf

LivingThingBaseClass要件に応じて、クラスにすることも、abstractクラスにすることもできますinterface

于 2013-02-03T14:12:26.517 に答える
0

一般的なアプローチは次のとおりです。

interface IRace  //or a base class, as deemed appropriate
{
    void DoSomething();
}

class Orc : IRace
{
    public void DoSomething()
    {
        // do things that orcs do
    }
}

class Elf : IRace
{
    public void DoSomething()
    {
        // do things that elfs do
    }
}

これで、heroRace が (スイッチの外側で) 次のように宣言されます。

IRace heroRace;

また、スイッチ内で次のことができます。

heroRace = new Orc(); //or new Elf();

その後...

heroRace.DoSomething();
于 2013-02-03T14:39:33.730 に答える
0
class test1 
    {
        int x=10;
        public int getvalue() { return x; }
    }
    class test2 
    {
        string y="test";
       public  string getstring() { return y;}

    }
    class Program
    {

        static object a;

        static void Main(string[] args)
        {
            int n = 1;
            int x;
            string y;
            if (n == 1)
                a = new test1();
            else
                a = new test2();

            if (a is test1){
               x = ((test1)a).getvalue();
               Console.WriteLine(x);
            }
            if (a is test2)
            {
                y = ((test2)a).getstring();
                Console.WriteLine(y);
            }
        }
    }
于 2013-02-03T14:40:53.053 に答える