如何创建一个空对象字段

本文关键字:一个 对象 字段 创建 何创建 | 更新日期: 2023-09-27 17:57:08

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

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不在交换机范围之外以供重复使用。如果我能创建这样的东西,这将大大简化我的程序。

如何创建一个空对象字段

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

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

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

例如。。

  ((Elf)o).methodNameWithinOrc();

将导致强制转换异常,因为oOrc的对象,而不是Elf的对象。

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

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

Object本身是没有用的,除非你覆盖ToStringGetHashCode..方法。

它应该像

 LivingThingBaseClass heroRace;

OrcElf应该是LivingThingBaseClass的子类

LivingThingBaseClass可以包含movespeakkill等方法。这些方法中的全部或部分将被Orc覆盖,Elf

根据您的要求,LivingThingBaseClass可以是abstract类,甚至是interface

一般方法是:

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();
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);
            }
        }
    }