C# 接收泛型类作为参数
我是普通班的新手。我现在正在做游戏。我会有很多敌人,它们都是从泛型Enemy基类继承的C# 接收泛型类作为参数,c#,unity3d,generics,C#,Unity3d,Generics,我是普通班的新手。我现在正在做游戏。我会有很多敌人,它们都是从泛型Enemy基类继承的 public abstract class EnemyBase<TState, TTransition> { protected StateMachine<TState, TTransition> m_FSM; } 这将起作用,但攻击方法是在另一个方法中调用的,因此此另一个方法也必须实现,并且此另一个方法由另一个方法调用。。。然后继续 我希望实现以下目标: public v
public abstract class EnemyBase<TState, TTransition>
{
protected StateMachine<TState, TTransition> m_FSM;
}
这将起作用,但攻击方法是在另一个方法中调用的,因此此另一个方法也必须实现
,并且此另一个方法由另一个方法调用。。。然后继续
我希望实现以下目标:
public void Attack()
{
EnemyBase enemy = GetComponent<EnemyBase>();
}
公共无效攻击()
{
EnemyBase敌人=GetComponent();
}
或
公共无效攻击()
{
EnemyBase敌人=GetComponent();
}
我不知道这些sintaxes是否正确,甚至不知道它们是否存在,但我只想知道这个类是否是EnemyBase,而不管它的泛型如何
谢谢
编辑:添加了用于的泛型类型您不能有一个字段具有未绑定的泛型类型,如
EnemyBase
您需要为通用类定义一个非通用基类,如EnemyBase:EnemyBase
,或者定义一个接口,如EnemyBase:IEnemy
然后您可以有一个
EnemyBase
或IEnemy
字段。您需要执行以下操作:
public class EnemySquire : EnemyBase<EnemySquire.State, EnemySquire.StateTransition>
{
public enum State
{
IDLE,
WALK,
ATTACKED,
DEAD,
}
public enum StateTransition
{
FOUND_FREE_GRID,
FINISHED,
FREED,
OUT_OF_LIFE,
ATTACKED,
}
}
public interface IEnemy
{
StateMachine m_FSM { get ; }
}
public abstract class EnemyBase<TState, TTransition> : IEnemy
{
protected StateMachine<TState, TTransition> m_FSM;
StateMachine IEnemy.m_FSM => this.m_FSM;
}
public class StateMachine
{
}
public class StateMachine<TState, TTransition> : StateMachine
{
}
公共接口IEnemy
{
状态机m_FSM{get;}
}
公共抽象类EnemyBase:IEnemy
{
受保护状态机m_FSM;
StateMachine IEnemy.m_FSM=>this.m_FSM;
}
公共类状态机
{
}
公共类状态机:状态机
{
}
定义公共接口,并且仅在实现端进行泛型,以公开这些接口。避免不必要的继承(紧密耦合)。在这种情况下,它必须是泛型的,因为EnemyBase有一个FSM,并且FSM接收这些泛型类型:protectedstatemachine m\u FSM代码>我用main方法实现了一个接口,这样我就可以从另一个类中获取。我想我可以声明一个未绑定的泛型类型。这会容易得多,但界面做到了。谢谢
public void Attack()
{
EnemyBase<,> enemy = GetComponent<EnemyBase<,>>();
}
public interface IEnemy
{
StateMachine m_FSM { get ; }
}
public abstract class EnemyBase<TState, TTransition> : IEnemy
{
protected StateMachine<TState, TTransition> m_FSM;
StateMachine IEnemy.m_FSM => this.m_FSM;
}
public class StateMachine
{
}
public class StateMachine<TState, TTransition> : StateMachine
{
}