亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在方法中強制轉換不同的子類

在方法中強制轉換不同的子類

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 關注
  • 167 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號