在抽象方法中使用继承的接口
Using inherited interface in abstract method
这是我的 C# 代码示例:
abstract class A {
public interface IA{
}
abstract protected void Print(IA obj);
}
abstract class B : A {
public interface IB : IA{
}
override protected void Print(IB obj){
// do something else
}
}
显然,编译器对我覆盖 class B 的 Print 方法并不疯狂。
我得到 "no suitable method found to override."
有没有办法让它工作?我不是在寻找设计更改,而是在寻找技术解决方案。
您无法在重写方法签名时更改它,这就是您通过将参数类型从 IA
更改为 IB
所做的。
幸运的是,您可以使用泛型来解决这个问题:
public interface IA{
}
public interface IB : IA{
}
abstract class A<T> where T : IA
{
abstract protected void Print(T obj);
}
abstract class B : A<IB> {
override protected void Print(IB obj){
// do something else
}
}
这是一个非常奇怪的设计,但您可以通过以下方式实现:
abstract class A {
public interface IA{
}
abstract protected void Print(IA obj);
}
abstract class B : A {
public interface IB : IA{
}
override protected void Print(IA obj){
}
protected void Print(IB obj){
Print(obj as IA);
}
}
这是我的 C# 代码示例:
abstract class A {
public interface IA{
}
abstract protected void Print(IA obj);
}
abstract class B : A {
public interface IB : IA{
}
override protected void Print(IB obj){
// do something else
}
}
显然,编译器对我覆盖 class B 的 Print 方法并不疯狂。
我得到 "no suitable method found to override."
有没有办法让它工作?我不是在寻找设计更改,而是在寻找技术解决方案。
您无法在重写方法签名时更改它,这就是您通过将参数类型从 IA
更改为 IB
所做的。
幸运的是,您可以使用泛型来解决这个问题:
public interface IA{
}
public interface IB : IA{
}
abstract class A<T> where T : IA
{
abstract protected void Print(T obj);
}
abstract class B : A<IB> {
override protected void Print(IB obj){
// do something else
}
}
这是一个非常奇怪的设计,但您可以通过以下方式实现:
abstract class A {
public interface IA{
}
abstract protected void Print(IA obj);
}
abstract class B : A {
public interface IB : IA{
}
override protected void Print(IA obj){
}
protected void Print(IB obj){
Print(obj as IA);
}
}