在抽象方法中使用继承的接口

时间:2018-07-24 18:45:55

标签: c# interface abstract

这是我在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
    }
}

显然,编译器对我覆盖B类的Print方法并不感到疯狂。

我收到“找不到合适的方法来覆盖。”

有没有办法使它起作用?我不是在寻求设计更改,而是在寻求技术解决方案。

2 个答案:

答案 0 :(得分:1)

您不能在覆盖方法签名时更改方法签名,这就是通过将参数类型从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
    }
}

答案 1 :(得分:0)

这是很奇怪的设计,但是您可以通过以下方式实现:

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