【问题标题】:using base class in interface在接口中使用基类
【发布时间】:2023-03-08 10:42:01
【问题描述】:

我有一个基类:

class BaseClass{ }

我想实现使用基类的接口:

public interface IClass
{
   BaseClass GetValue();
}

然后创建实现此接口的子类,但在方法中返回自己的类类型:

class Child: BaseClass, IClass
{
   Child GetValue(); 
}

我怎样才能正确地做到这一点?

【问题讨论】:

    标签: c# class interface


    【解决方案1】:

    使用泛型:

    public interface IClass<T> where T : BaseClass
    {
       T GetValue();
    }
    class Child: BaseClass, IClass<Child>
    {
       Child GetValue(); 
    }
    

    【讨论】:

      【解决方案2】:

      这并不容易。您期望它工作的方式并不是因为任何实现 IClass 的类都必须完全从接口实现该方法(如果您有 IClass 的实例,您怎么知道GetValue() 返回的静态类型是 Child?有使用泛型的变通方法,但它们可能不太好用,即

       public T GetValue<T>();
      

      您可以在其中准确指定要返回的类型。但是,如果与虚拟重载结合使用,这可能会变得非常难看。另一种选择是创建一个新的实现:

      class Child: BaseClass, IClass
      {
          BaseClass IClass.GetValue(); 
          new Child GetValue();
      }
      

      像这样,如果调用中对象的静态类型是IClass,你会得到一个BaseClass,如果它是静态的Child,你会得到一个Child

      记住

      IClass a = new Child();
      Child b = a.GetValue(); // Error: Cannot convert BaseClass to Child
      

      永远不会起作用,因为 IClass.GetValue() 的 static 返回类型是 BaseClass。

      【讨论】:

        猜你喜欢
        • 2019-08-25
        • 1970-01-01
        • 1970-01-01
        • 2023-04-09
        • 2010-09-30
        • 2012-05-01
        • 2020-09-04
        • 1970-01-01
        • 2016-06-19
        相关资源
        最近更新 更多