snisn 2019-07-01 23:02 采纳率: 100%
浏览 283
已采纳

C#若不使用指针,如何存储和读取从一个基类派生的多种派生类?

各位专家好!设有一个基类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# 有基类对象,如何知道是那个派生类的》,但水平有限,不是很理解……同时也希望了解能否不通过指针来实现以上需求?

  • 写回答

1条回答

  • threenewbee 2019-07-02 09:04
    关注

    不可能啊,你有virtual和override,又是通过BaseMan调用,肯定调用的是派生类的DoSomething

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥200 uniapp长期运行卡死问题解决
  • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
  • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?
  • ¥15 乘性高斯噪声在深度学习网络中的应用
  • ¥15 关于docker部署flink集成hadoop的yarn,请教个问题 flink启动yarn-session.sh连不上hadoop,这个整了好几天一直不行,求帮忙看一下怎么解决
  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集