![](/img/trans.png)
[英]Using Generics in Base Classes in C#: How to ensure methods in the base class return the derived class's type?
[英]Overloading methods while using Generics with base classes
我有以下課程:
public abstract class Gear<T> : ScriptableObject, IGear { ... }
public class Armor : Gear<ArmorStatsLevel> { ... }
public class Weapon : Gear<WeaponStatsLevel> { ... }
現在,我可以使用以下方法列出實例:
public abstract class WidgetListArmor {
public void ActionSelected(Armor gear) {
if (...) GameSession.Equip(gear);
}
}
public abstract class WidgetListWeapon {
public void ActionSelected(Weapon gear) {
if (...) GameSession.Equip(gear);
}
}
因為這是多余的,所以我想到了將其全部轉移到基本類:
public abstract class WidgetListGear<T> : MonoBehaviour {
public void ActionSelected(T gear) {
if (...) GameSession.Equip(gear);
}
}
public class WidgetListArmors : WidgetListGear<Armor> { ... }
public class WidgetListWeapons : WidgetListGear<Weapon> { ... }
盡管這看起來更干凈,但我現在遇到了一個新問題。 因為T是泛型, GameSession.Equip
不能使gear
超載。
我是否選擇了錯誤的模式來組織代碼? 我是否從泛型中缺少可以執行此操作的內容?
UPDATE
這是GameSession簽名:
public class GameSession {
public static bool Equip(Armor armor);
public static bool Equip(Weapon weapon);
}
使Weapon
and Armor
實現名為IGear
的接口,例如:
public interface IGear
{ }
public class Weapon : IGear
{
//snip
}
public class Armor : IGear
{
//snip
}
將通用類型限制為IGear
:
public abstract class WidgetListGear<T> : MonoBehaviour
where T : IGear
{
public void ActionSelected(T gear) {
if (...) GameSession.Equip(gear);
}
}
並使GameSession.Equip
以IGear
作為參數類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.