为了账号安全,请及时绑定邮箱和手机立即绑定

在方法中强制转换不同的子类

在方法中强制转换不同的子类

C#
一只斗牛犬 2021-04-08 14:15:28
我想发送,接收和转换SkillEvent类的子类,并能够根据其类型在内部抓取自定义参数。可能有许多具有不同参数的不同子类。有没有一种方法可以避免为每种技能编写不同的方法?class SkillEvent { float timestamp, EventType type }class GrenadeSkillEvent : SkillEvent { Vector3 target_point}[ClientRpc]RpcSendSkillEvent(SkillEvent event){    eventManager.ExecuteEvent(event);}ExecuteEvent(SkillEvent event){    switch(event.type){        case GrenadeSkillEvent :             GrenadeSkillEvent grenadeEvent = (GrenadeSkillEvent) event;            float grenadeParam = event.grenadeParam;            break;        case OtherSkillEvent :             OtherSkillEvent otherEvent = (OtherSkillEvent ) event;            string stringParam = event.stringParam;            break;    }}我认为可以这样做,但显然不行。有没有一种方法可以避免为每种技能编写不同的方法?编辑 :GrenadeSkillEvent和OtherSkillEvent是SkillEvent的子级。它们都有一个时间戳和一种类型,我认为我可能需要帮助将事件变量转换为正确的SkillEvent子类。我的问题是,它们具有相同的方法(可以说是execute),但是每种子类都需要不同类型的参数。例如,一个GrenadeEvent可能需要一个目标点,爆炸的大小和伤害。一个BonusEvent可能有些HP添加到播放器。一个TerrainEvent可以激活一个重要的目标靠近播放器等一些自定义动画这些技能背后的所有逻辑都是相同的。它们都有两种方法:Simulate(SkillEvent Event) and Render(SkillEvent Event)但是例如在GrenadeSkill中,我需要它Simulate(GrenadeSkillEvent Event) and Render(GrenadeSkillEvent Event)编辑2:networkedPlayer.RpcOnSkillEvent(    new SkillEvent[] {        new GrenadeSkillEvent() {            timestamp = state.timestamp,            id = 0,            point = target        }     });编辑3:var dictionary = new Dictionary<Type, Action<SkillEvent>> {    {        typeof(GrenadeSkillEvent), (SkillEvent e) => {            Debug.Log("GrenadeSkill OnConfirm point"+ ((GrenadeSkillEvent)e).point);        }    }};public override void OnConfirm(SkillEvent skillEvent) {    if (skillEvent == null) return;    Debug.Log(skillEvent.GetType());    dictionary[skillEvent.GetType()](skillEvent);}
查看完整描述

3 回答

?
慕田峪4524236

TA贡献1875条经验 获得超5个赞

最好的方法是在顶级类上编写通用的getter方法,SkillEvent然后在special类中重写该方法。由于您似乎需要不同的类型,因此我认为您可以使用执行您在类内部进行参数化的方法的方法


这是您当前代码已发布的示例:


class SkillEvent { 


  float timestamp; 


  EventType type ;


  public virtual void executeEvent(){ //handles the general case for the execute funciton

    execute(timestamp);

  }

}


class GrenadeSkillEvent : SkillEvent { //overriden to pass target point into event execution


  Vector3 target_point;


  public override void executeEvent(){

    execute(target_point);

  }

}


class BonusEvent : SkillEvent { 


  int bonus_health;


  public override void executeEvent(){/overriden to pass bonus health into event

    execute(bonus_health);

  }

}


class TerrainEvent : SkillEvent { 


  GameObject obj;


  public override void executeEvent(){//overriden to play animation before event is executed

    animation(obj);

    execute();

  }

}


[ClientRpc]

RpcSendSkillEvent(SkillEvent event){

    eventManager.ExecuteEvent(event);

}


ExecuteEvent(SkillEvent event){

    event.executeEvent();

}


查看完整回答
反对 回复 2021-04-24
  • 3 回答
  • 0 关注
  • 153 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号