[英]In C#, how can you have a global generic class?
因此,我有一個使用BaseEngine命名空間的抽象類的基礎集,以及派生該類的真實游戲項目。
有許多基類具有一組抽象方法和預定義方法,例如:項目,實體,技能
public abstract class Item
{
public string name;
public void DestroyItemInBaseEngine ()
{
// bunch of codes
}
public abstract void BakeItemTheWayYouWant ();
}
public abstract class SkillManager
{
public abstract T InteractItemWithSkill<T> (T item)
where T:Item, new(); //not sure if this particular line is valid, but this was written just to help you understand
}
和派生類,例如:
public class GameItem : Item
{
public int variableSpecificToThisGameProject;
// and other implementation for this specific game...
}
現在,在BaseEngine中,它將具有抽象類,這些抽象類在諸如BaseItemManager的管理器中多次引用Item。 每個游戲的管理方式都不同,因此也必須派生這些管理器。 當特定游戲項目派生BaseItemManager時,它將必須使用GameItem。
創建BaseEngine的目的是可以與不同的項目(基本上是一組抽象類)一起使用。
每次在游戲項目中引用這些派生對象時,您要么必須強制轉換它,要么在諸如此類的抽象方法中使用通用類型:
if (ValidateItemObject<GameItem> (GameItem item) != null)
// do something with it
因此,由於GameItem和其他類型是在編譯時決定的,因此整個項目是否都需要聲明T = GameItem,S = GameSkill,因此我們不必在每次調用相關方法(如上述)或類時都提及?
我盡力使案件盡可能清楚,但如果不清楚我想做什么,請告訴我。
編輯:
protected abstract T ConvertTableToItem<T> (T item, LuaTable luaTable) where T:BaseItem;
protected override ProjectItem SetItemAPI<ProjectItem> (ProjectItem newItem, LuaTable luaTable)
{
newItem.desc = "test";
}
說desc不是該類的成員,這是行不通的。 我可以保證是這樣。 desc(公共字符串desc)在ProjectItem中定義。
ProjectItem是BaseItem的派生類。
如果要為泛型類型聲明帶有固定類型參數的類,最簡單的方法是在指定所需的類型參數的同時繼承泛型類型。 例如:
static class SomeSpecificClass : SomeBaseClass<GameItem> { ... }
然后,可以通過SomeSpecificClass
調用SomeBaseClass<T>
中依賴類型參數T
任何方法,而無需指定類型參數T
就是說,工具箱中的另一個可能至少解決您提供的示例的工具是利用C#的類型推斷進行泛型方法的利用。
例如,如果您有一個像這樣的基類通用方法:
class SomeBaseClass
{
public static T ValidateItemObject<T>(T item) where T : Item
{
// ...something
}
}
這樣,只要正確鍵入傳遞的參數,實際上就不需要在調用方法時使用type參數。 例如:
GameItem gameItem = ...;
if (SomeBaseClass.ValidateItemObject(gameItem) != null)
{
// ...something
}
(自然,如果代碼在繼承SomeBaseClass
的類中,則在調用該方法時實際上不需要指定類名)。
不幸的是,您的實際代碼示例相當模糊。 但是根據對問題的評論和您的答復,以上內容似乎可以解決您的問題。 如果不是,請考慮編輯您的問題,以提供一個更具體, 完整 ,但最少的代碼示例 ,以及對該示例現在的功能以及您希望如何更改的清晰描述。 您可能還想閱讀https://stackoverflow.com/help/how-to-ask,以獲得有關改善問題清晰度的提示。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.