4

我需要将一个类似rogue的游戏编写为一个项目,但我有一个小问题。有时我需要选择使用开关创建哪个对象。我想在开关之外声明一个“空”对象,然后开关用值填充对象。这就是我想做的事情:

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在 switch 范围之外进行重用。如果我可以创建类似的东西,它将大大简化我的程序。

4

3 回答 3

4

在访问它的成员之前,您需要将对象转换为更具体的类型

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

但这可能会导致强制转换异常。

例如..

  ((Elf)o).methodNameWithinOrc();

会导致强制转换异常,因为o它是Orcnot的对象Elf

is最好在使用运算符进行转换之前检查对象是否属于特定类

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

ObjectToString除非您覆盖, GetHashCode.. 方法,否则它本身没有用

它应该像

 LivingThingBaseClass heroRace;

Orc并且Elf应该是的子类LivingThingBaseClass

LivingThingBaseClass可以包含像move, speak, kill.. 这样的方法。所有或其中一些方法将被Orcand覆盖Elf

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;

在 switch 中,您可以:

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 回答