C#-覆盖泛型抽象方法的泛型类型约束



是否可以覆盖抽象方法实现的泛型约束?

让我解释一下。。。通常我会做一些类似的事情:

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函数传递一个无效的参数类型。

我希望能够做一些类似的事情

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...
}
}

所以,基本上,覆盖我在父对象的抽象泛型方法中设置的泛型约束。有办法做到这一点吗?

请注意:我不想创建泛型类,只想创建一个泛型方法,它能够为基类的每个不同实现获得正确类型的数据。

显然,我试图实现的目标目前在C#中是不可能实现的。在等了一段时间看是否有变通办法后,我决定引用JasperKent的评论作为最终答案:

语言根本不允许这样。请参阅:learn.microsoft.com/en-us/dotnet/csharp/misc/s0460

显然在您编码时不支持它。但你可以尝试一种不同的编码方式:

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; }

最新更新