【问题标题】:C# generic method with inheritance and interface具有继承和接口的 C# 泛型方法
【发布时间】:2013-01-02 16:06:46
【问题描述】:

这确实是一件非常简单的事情,但在接口方面,我正在努力解决继承的问题。

给定以下类,如何在不覆盖基方法的情况下在特定于类 Parent 的接口中接口 Get 方法?

public class Base<T, T2>
{
    public T Get<T, T2>(string key)
    {
        ...
    }
}

public class Parent : Base<Type1, Type2>, IParent
{
    ...
}

这是我的 atm,但我不断收到“接口成员 Type1 IParent.Get(string) 未实现”错误。

public interface IParent
{
    Type1 Get(string key);
}

【问题讨论】:

  • 如果类中已经声明了Get&lt;T,T2&gt;,则不需要在方法中使用。
  • 感谢所有cmets,它帮助我更好地理解了它。 ja72、Krizz、Charles 和 Guvante 都一针见血,但 Charles 的描述是最深入的(有代码示例,不少于),所以他得到了绿色勾号 :)

标签: c# inheritance interface


【解决方案1】:

public T Get&lt;T, T2&gt;(string key) 将在泛型类上创建一个泛型方法。 TT2 将是此泛型方法的参数,与类的 TT2 无关。

只要public T Get(string key)

【讨论】:

    【解决方案2】:

    Base&lt;T,T2&gt;T Get&lt;T,T2&gt;(string) 方法和IParentType1 Get(string) 方法是两个不同的方法签名。您需要同时实现两者。如果您希望两种实现都使用相同的功能,您可以执行以下操作:

    public class ParentJ : Base<Type1, Type2>, IParent {
     public Type1 Get(string key) {
        return this.Get<Type1,Type2>(key);
     }
    }
    

    但是我相信您的初衷不是参数化Base&lt;T,T2&gt; 中的Get() 方法,因此您可以这样写Base

    public class Base<T,T2> {
      public T Get(string key) {
        // implementation here
      }
    }
    

    该签名将满足IParent 中的方法签名。

    当类型不能或不应该由包含该方法的类推断时,您只需要方法上的类型参数(例如TT2)。

    【讨论】:

      【解决方案3】:

      匹配方法时,此签名必须完全匹配。签名的组成部分之一是泛型参数的数量。

      您的IParent 接口包含一个带有零类型参数的方法Get。您的 Base 类包含一个方法 Get 和两个类型参数。

      虽然Base.Get 看起来共享它的类型参数,但实际上并没有,使用的语法创建了两个新的类型参数,它们隐藏了类的类型参数。

      解决方法是在Parent 中简单地实现一个Get 方法,该方法没有任何类型参数。

      【讨论】:

        【解决方案4】:

        试试这个。您不覆盖基本Get,而是实现IParent

        public class Type1 { }
        public class Type2 { }
        
        public interface IParent
        {
            Type1 Get(string key);
        }
        
        public class Base<T, T2> 
        {
            public T Get(string key)
            {
                return default(T);
            }
        }
        public class Parent : Base<Type1, Type2>, IParent
        {
        }
        

        【讨论】:

          【解决方案5】:

          尝试使用通用 IParent 接口。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2021-10-27
            • 1970-01-01
            • 1970-01-01
            • 2020-05-17
            • 2013-10-04
            • 2021-06-24
            • 1970-01-01
            相关资源
            最近更新 更多