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

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

具有不確定方法簽名的抽象方法

具有不確定方法簽名的抽象方法

紅顏莎娜 2023-06-08 20:47:37
我有一個設計問題。我試著寫一個角色扮演游戲,讓巫師互相戰斗。他們通過施法互相對抗。我決定為所有法術創建一個抽象超類?;旧?,一個咒語是一個有名字的對象(例如火球),知道它的巫師(通過巫師值確定咒語的強度)并且必須施放咒語,所以它應該有一個抽象方法“cast ”。public abstract class Spell {    private String name;    private Sorcerer sorcerer;    public abstract void cast();}但是現在我有一個問題:我無法規范這個方法的方法簽名,因為不同的咒語需要不同的參數并且可能有不同的返回值。治療施法可以治療巫師并且可能不需要參數。但是例如火球法術需要一個敵人作為參數。我將不得不為法術定義不同的基類。這可能會導致爆炸式的類層次結構。有沒有辦法定義某種“海綿方法”來重載?或者有更好的方法來解決這個問題嗎?
查看完整描述

2 回答

?
波斯汪

TA貢獻1811條經驗 獲得超4個贊

一種方法是使用可變參數。假設一個法術只能由一個巫師施展,它看起來像這樣:


public abstract class Spell {

? ? private String name;

? ? public abstract void cast(Sorcerer sorcerer, Target... targets);

}

cast 方法接受 1 個巫師和 0 個或更多目標


更好的方法

通過查看示例,似乎總是有一個巫師與一個法術相關聯,該法術被保存到類變量 sorcerer(施放法術的角色)中。通過為那個 sorcerer 創建一個 getter,可以cast進一步簡化方法簽名:


public abstract class Spell {

? ? private String name;

? ? private Sorcerer sorcerer;

? ? public Sorcerer getSorcerer() {

? ? ? ? return sorcerer;

? ? }

? ? public abstract void cast(Target... targets);

}

這樣仍然可以從子類訪問 sorcerer,但它不是方法cast簽名的一部分。


如果我理解正確的話,該方法還應該支持不同的返回類型。實現這一點的一種方法是創建一個類(例如 SpellConsequence),它可以包含不同的值和類型。這樣可以從 cast 方法返回 SpellConsequence 類。


查看完整回答
反對 回復 2023-06-08
?
哈士奇WWW

TA貢獻1799條經驗 獲得超6個贊

怎么樣void cast(Sorcerer source, Targetable target)?你可以spell.cast(myself, myself)治愈或spell.cast(myself, enemyPositionOrWhatever)。



查看完整回答
反對 回復 2023-06-08
  • 2 回答
  • 0 關注
  • 163 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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