【问题标题】:Using inherited interface in abstract method [duplicate]在抽象方法中使用继承的接口[重复]
【发布时间】:2018-07-24 18:45:55
【问题描述】:

这是我的 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 方法而疯狂。

我得到“没有找到合适的方法来覆盖。”

有没有办法让它工作?我不是在寻找设计更改,而是在寻找技术解决方案。

【问题讨论】:

    标签: c# interface abstract


    【解决方案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
        }
    }
    

    【讨论】:

    • 这是我正在寻找的建议。但是,当我定义 B 类时,编译器看不到 IB,或者我遗漏了什么?
    • 您尝试过并遇到编译器错误吗?我直接在这里写了代码,所以我可能是错的,但是据我记得这是处理这种情况的方法......
    • 是的,它的意思是“找不到类型或命名空间名称 'IB'(您是否缺少 using 指令或程序集引用?”我什至复制并粘贴了名称以确保我没有'没有拼写错误。:)
    • 可能是因为它是类的内部类型。如果它是顶级类型呢?
    • 是的……在这种情况下,用类封装接口是没有意义的。我将接口与类分开...感谢您的建议。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2018-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-16
      • 1970-01-01
      • 2012-08-06
      • 2013-01-09
      相关资源
      最近更新 更多