7

我敢肯定,这真的很简单,但是当涉及到接口时,我正在努力解决继承的问题。

给定以下类,如何在不覆盖基方法的情况下在特定于类 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);
}
4

5 回答 5

5

public T Get<T, T2>(string key)将在泛型类上创建一个泛型方法。TandT2将是这个泛型方法的参数,并且与类的Tand没有关系T2

做吧public T Get(string key)

于 2013-01-02T16:11:45.667 回答
2

T Get<T,T2>(string)method ofBase<T,T2>和 method Type1 Get(string)method ofIParent是两个不同的方法签名。您需要同时实现两者。如果您希望两种实现都使用相同的功能,您可以执行以下操作:

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

但是我相信你的初衷不是参数化Get()方法,Base<T,T2>因此你会这样写Base

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

该签名将满足IParent.

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

于 2013-01-02T16:14:41.827 回答
2

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

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

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

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

于 2013-01-02T16:15:24.720 回答
1

尝试这个。您不会覆盖基础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
{
}
于 2013-01-02T16:17:49.620 回答
0

尝试使用通用 IParent 接口。

于 2013-01-02T17:33:55.483 回答