【发布时间】:2021-07-19 21:49:55
【问题描述】:
是否可以覆盖抽象方法实现的泛型约束?
让我解释一下...通常我会这样做:
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...
}
}
所以,基本上,覆盖我在父类抽象泛型方法中设置的泛型约束。有没有办法做到这一点?
请注意:我不想创建一个泛型类,而只想创建一个泛型方法,该方法能够为每个基类的不同实现获取正确类型的数据。
【问题讨论】:
-
这可能无效:您已承诺
DoSomething将接受A中的任何IData。您不能在B或C中改变主意,只接受更多派生类型,即使约束以任何方式变化(它们不是)。在此处仔细考虑您真正想要实现的类型安全(如果有的话)。通常,这种设计通常意味着您正在设置您实际上不想要的继承层次结构,但最好通过扩展方法、具体类或(如果确实需要)new方法和派生中的显式下级强制转换来完成类。 -
尝试将类型参数放在
A类而不是DoSomething方法上 -
这能回答你的问题吗? Force derived class to implement interface
-
在
public abstract class A()中,()无效。您能否更正代码以使其成为有效的 C#? -
语言根本不允许这样做。见:docs.microsoft.com/en-us/dotnet/csharp/misc/cs0460
标签: c# generics overriding abstract-methods