[英]C# - Override generic type constraints of generic abstract methods
是否可以覆蓋 generics 約束以實現抽象方法?
讓我解釋一下......通常我會做類似的事情:
public abstract class A
{
public abstract class IData {}
public abstract void DoSomething(IData data);
}
public class B : A
{
public DataB : IData
{
public int ciao;
}
public override void DoSomething(IData data)
{
DataB d = data as DataB;
if (d == null)
{
// print error or whatever...
return;
}
int miao = d.ciao * 2;
// do whatever with miao or d.ciao...
}
}
public class C : A
{
public DataC : IData
{
public float arrivederci;
}
public override void DoSomething(IData data)
{
DataC d = data as DataC;
if (d == null)
{
// print error or whatever...
return;
}
int bau = d.arrivederci * 2f;
// do whatever with bau or d.arrivederci...
}
}
我不喜歡的是我可以將無效的參數類型傳遞給DoSomething
function。
我希望能夠做類似的事情
public class B : A
{
public DataB : IData
{
public int ciao;
}
public override void DoSomething(DataB data)
{
int miao = d.ciao * 2;
// do whatever with miao or d.ciao...
}
}
public class C : A
{
public DataC : IData
{
public float arrivederci;
}
public override void DoSomething(DataC data)
{
int bau = d.arrivederci * 2f;
// do whatever with bau or d.arrivederci...
}
}
這當然是不可能的。
出於這個原因,我最終做了類似的事情:
public abstract class A
{
public abstract class IData {}
public abstract void DoSomething<T>(T data) where T : IData;
}
下一步將是制作類似的東西
public class B : A
{
public DataB : IData
{
public int ciao;
}
public override void DoSomething<T>(T data) where T : DataB
{
int miao = d.ciao * 2;
// do whatever with miao or d.ciao...
}
}
public class C : A
{
public DataC : IData
{
public float arrivederci;
}
public override void DoSomething<T>(T data) where T : DataC
{
int bau = d.arrivederci * 2f;
// do whatever with bau or d.arrivederci...
}
}
所以,基本上,覆蓋我在父抽象泛型方法中設置的泛型約束。 有沒有辦法做到這一點?
請注意:我不想創建一個通用的 class,但只創建一個通用方法,它能夠根據基本 class 的每個不同實現獲取正確類型的數據。
顯然,我想要實現的目標目前在 C# 中是不可能的。 等了一會兒看看是否有解決方法后,我決定引用 JasperKent 的評論作為最終答案:
語言根本不允許這樣做。 請參閱: docs.microsoft.com/en-us/dotnet/csharp/misc/cs0460
顯然它在您編碼時不受支持。 但您可以嘗試不同的編碼,如下所示:
public abstract void DoSomething<T, TConstraint>(T data) where T : TConstraint;
....
public override void DoSomething<T, DataB>(T data){ //your code here; }
....
public override void DoSomething<T, DataC>(T data){ //your code here; }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.