簡體   English   中英

在C#中,如何擁有全局泛型類?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM