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