如何创建空对象字段?

时间:2013-02-03 14:08:45

标签: c# object

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

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位于交换机范围之外以便重新使用。如果我可以创建类似的东西,它将大大简化我的程序。

3 个答案:

答案 0 :(得分:3)

在访问对象

之前,您需要将对象强制转换为更具体的类型
Object o=new Orc();
((Orc)o).methodNameWithinOrc();

但这可能导致施放异常。

例如......

  ((Elf)o).methodNameWithinOrc();

会导致转换异常,因为oOrc而非Elf的对象。

最好在使用is运算符

进行投射之前检查对象是否属于特定类
 if(o is Orc)
((Orc)o).methodNameWithinOrc();

除非您覆盖ObjectToString ..方法

,否则

GetHashCode本身无效

应该是

 LivingThingBaseClass heroRace;

OrcElf应该是LivingThingBaseClass

的子类

LivingThingBaseClass可以包含movespeakkill等方法。Orc和{{1}会覆盖所有或部分方法}}

Elf可以是LivingThingBaseClass类,甚至是abstract,具体取决于您的要求

答案 1 :(得分: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();

答案 2 :(得分: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);
            }
        }
    }