强制转换为泛型类的任意版本



我有一个类如下:

public class Impactable<T> : where T : Spawnable<T>
{
protected T spawnable = Spawnable<T>.Instance;
void DoSomethingIndependentOfT(){}
}

我之所以这样实现它,是因为Spawnable是一个懒惰的可扩展Singleton。在Impable中,我当然有使用spawnable的方法,但也有不想通过强制转换从外部访问的方法。

public sealed class EnemySpawnable : Spawnable<EnemySpawnable>
{
}
public class MyEnemyA : Impactable<EnemySpawnable>
{
}
MyEnemyA enemy = new MyEnemyA();
Impactable x = enemy;
x.DoSomethingIndependentOfT();

有可能在C#中实现这样的转换吗?还是我必须重新设计我的代码?

不,不是。Impactable(where(上的类型参数约束阻止了它。但所需的重构是不间断的,而且很琐碎。解决方案是将与类型无关的方法提升到不需要专门化的基类,比如

public class Spawnable<T>
{
public static T Instance;
}
public class Impactable
{
internal void DoSomethingIndependentOfT() { }
}
public class Impactable<T> : Impactable where T : Spawnable<T>
{
protected T spawnable = Spawnable<T>.Instance;
}
public sealed class EnemySpawnable : Spawnable<EnemySpawnable>
{
}
public class MyEnemyA : Impactable<EnemySpawnable>
{
}
public class Program
{
public static void Main()
{
MyEnemyA enemy = new MyEnemyA();
Impactable x = enemy;
x.DoSomethingIndependentOfT();
}
}

即使您的意图是可能的(或者在C#的未来版本中是可能的(,这样做仍然要干净得多,因为它会自行记录意图(不使用泛型的方法,不应该驻留在限制类型的容器中(。

最新更新