我需要将类似流氓的游戏编码为项目,但我有一个小问题。有一段时间我需要在使用开关创建哪个对象之间进行选择。我想在交换机外面声明一个“空”对象,然后交换机用值填充对象。这就是我想做的事情:
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
位于交换机范围之外以便重新使用。如果我可以创建类似的东西,它将大大简化我的程序。
答案 0 :(得分:3)
在访问对象
之前,您需要将对象强制转换为更具体的类型Object o=new Orc();
((Orc)o).methodNameWithinOrc();
但这可能导致施放异常。
例如......
((Elf)o).methodNameWithinOrc();
会导致转换异常,因为o
是Orc
而非Elf
的对象。
最好在使用is
运算符
if(o is Orc)
((Orc)o).methodNameWithinOrc();
Object
,ToString
..方法,否则 GetHashCode
本身无效
应该是
LivingThingBaseClass heroRace;
Orc
和Elf
应该是LivingThingBaseClass
LivingThingBaseClass
可以包含move
,speak
,kill
等方法。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);
}
}
}