我有一個類如下:
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# 中實作這樣的轉換,還是我必須重新設計我的代碼?
uj5u.com熱心網友回復:
不,這不對。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# 的未來版本中成為可能),這樣做仍然要干凈得多,因為它自我記錄了意圖(不使用泛型的方法,不應駐留在容器范圍為受限型別)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/370267.html
上一篇:Java泛型下界
