簡體   English   中英

通過從C#中的泛型類派生來創建類型別名

[英]Creating a type alias by deriving from a generic class in C#

我有一個帶有一些通用參數的類,很難在使用的十幾個類中進行輸入。

public abstract class StateBase<StatesList, StateData>
    where StatesList : class
    where StateData : class
{
    public string Name { get; protected set; }
    protected StatesList stateList;
    protected StateData stateData;

    public StateBase(StatesList stateList, StateData stateData)
    {
        Name = this.GetType().Name;
        this.stateList = stateList;
        this.stateData = stateData;
    }

    public abstract bool CanTransitionTo(StateBase<StatesList, StateData> newState);
    public abstract void Enter();
    public abstract StateBase<StatesList, StateData> Tick();
    public abstract void Exit();
}

我熟悉C / C ++的typedef功能,現在想念它。 我知道C#最接近的功能是“ using”指令,它使您可以將別名定義為單個文件。 我可能會回到失敗的角度,但是現在,這些類一直在變化,我希望有更多的東西忘了。

因此,我試圖通過制作一個新類來優雅地解決別名問題,該類從上述類派生並填充了所有通用參數。

public abstract class AIState : StateMachine.StateBase<UnitAIStateList, AIStateData>
{
    public abstract override bool CanTransitionTo(AIState newState);
    public abstract override void Enter();
    public abstract override void Exit();
    public abstract override new AIState Tick();
}

如您所料,C#並沒有讓我輕易擺脫它。 基類的Tick()返回通用版本。 我的派生類替代了實際類型。 看起來它應該可以工作,因為AIState是它所要求的同一類型:

'AIState.Tick()': return type must be 'StateBase<UnitAIStateList, AIStateData>' to match overridden member 'StateBase<UnitAIStateList, AIStateData>.Tick()'

我懷疑這是失敗的原因是因為C#沒有實現類型協方差,這是我並不十分熟悉的功能。 但是,實際上,我對它還不夠熟悉,無法真正知道這是否是我的解釋。

幾件事情;

1)我會考慮您的選擇,以要求您的Tick方法提供StateBase<StatesList, StateData>類型的結果。 您需要使用什么絕對最小類型? object就足夠了嗎?

2)如果確實需要“與類型相同”的返回值,則必須以循環方式使用泛型,例如:

public abstract class StateBase<StatesList, StateData, TChildType>
 where StatesList : class
 where StateData : class
 where TChildType : StateBase<StatesList, StateData, TChildType> //notice addition of TChildType
{
    public string Name { get; protected set; }
    protected StatesList stateList;
    protected StateData stateData;

    public StateBase(StatesList stateList, StateData stateData)
    {
        Name = this.GetType().Name;
        this.stateList = stateList;
        this.stateData = stateData;
    }

    public abstract bool CanTransitionTo(TChildType newState);
    public abstract void Enter();
    public abstract TChildType Tick();
    public abstract void Exit();
}

public class DerivedState : StateBase<string, string, DerivedState>
{
    ...
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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