各位专家好!设有一个基类BaseMan,派生了多种派生类BatMan、SuperMan、SpiderMan……示例如下:
class BaseMan
{
int m_ID;
public virtual void DoSomething() { }
//此处省略大量无关的代码
}
class BatMan:BaseMan
{
public override void DoSomething()
{
//动作1
}
//此处省略大量无关的代码
}
class SuperMan:BaseMan
{
public override void DoSomething()
{
//动作2
}
//此处省略大量无关的代码
}
……
现在期望实现以下2个功能,其中功能2实现不了,求指点,感谢!
功能1、用1个数组统一存储所有派生类的对象(每个对象有唯一标识的ID)——已实现,代码如下:
class ManManager
{
Dictionary<int, BaseMan> dicMan = new Dictionary<int, BaseMan>();
public void RegisterMan(int id,BaseMan man)
{
dicMan.Add(id,man);
}
//此处省略大量无关的代码
}
功能2、通过ID读取对象,并调用对象中的DoSomething——未实现。我的代码如下,调试发现实际调用的是基类的DoSomething,请问这个程序应该怎么修改呢?
//第1步,在ManManager中增加一个接口GetManFromID
class ManManager
{
Dictionary<int, BaseMan> dicMan = new Dictionary<int, BaseMan>();
public void RegisterMan(int id,BaseMan man)
{
dicMan.Add(id,man);
}
public BaseMan GetManFromID(int id)
{
return dicMan[id];
}
//此处省略大量无关的代码
}
//第2步,在主函数中建立对象,并把各种Man存到字典里
ManManager mm=new ManManager();
BatMan man1=new BatMan();
SuperMan man2=new SuperMan();
mm.RegisterMan(1,man1);
mm.RegisterMan(2,man2);
//第3步,通过ID读出对象,结果出了问题
mm.GetManFromID(1).DoSomething();//这句执行的DoSomething,实际为基类BaseMan的DoSomething,而我期望执行的是ID=1的对象的DoSomething
之前也反复学习了论坛内的2篇文章《如何用数组存放一个基类派生的多种派生类》、《在线等!!!C# 有基类对象,如何知道是那个派生类的》,但水平有限,不是很理解……同时也希望了解能否不通过指针来实现以上需求?