转换为任意版本的泛型 class
Casting to arbitrary version of generic class
我有一个class如下:
public class Impactable<T> : where T : Spawnable<T>
{
protected T spawnable = Spawnable<T>.Instance;
void DoSomethingIndependentOfT(){}
}
我之所以这样实现它是因为 Spawnable 是一个 Lazy 可扩展单例。在 Impactable 中,我当然有利用 spawnable
的方法,但也有我不想通过强制转换从外部访问的方法。
public sealed class EnemySpawnable : Spawnable<EnemySpawnable>
{
}
public class MyEnemyA : Impactable<EnemySpawnable>
{
}
MyEnemyA enemy = new MyEnemyA();
Impactable x = enemy;
x.DoSomethingIndependentOfT();
是否可以在 C# 中实现这样的转换,或者我是否必须重新设计我的代码?
不,不是。 Impactable
(where
) 上的类型参数约束阻止了它。但所需的重构是不间断且微不足道的。解决方案是将与类型无关的方法提升为不需要专门化的基础 class,如下所示:
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# 版本中成为可能),这样做仍然更加清晰,因为它会自行记录意图(不使用泛型的方法,不应驻留在限定类型的容器中。
我有一个class如下:
public class Impactable<T> : where T : Spawnable<T>
{
protected T spawnable = Spawnable<T>.Instance;
void DoSomethingIndependentOfT(){}
}
我之所以这样实现它是因为 Spawnable 是一个 Lazy 可扩展单例。在 Impactable 中,我当然有利用 spawnable
的方法,但也有我不想通过强制转换从外部访问的方法。
public sealed class EnemySpawnable : Spawnable<EnemySpawnable>
{
}
public class MyEnemyA : Impactable<EnemySpawnable>
{
}
MyEnemyA enemy = new MyEnemyA();
Impactable x = enemy;
x.DoSomethingIndependentOfT();
是否可以在 C# 中实现这样的转换,或者我是否必须重新设计我的代码?
不,不是。 Impactable
(where
) 上的类型参数约束阻止了它。但所需的重构是不间断且微不足道的。解决方案是将与类型无关的方法提升为不需要专门化的基础 class,如下所示:
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# 版本中成为可能),这样做仍然更加清晰,因为它会自行记录意图(不使用泛型的方法,不应驻留在限定类型的容器中。