具有继承和接口的C#泛型方法

时间:2013-01-02 16:06:46

标签: c# inheritance interface

这是非常简单的事情我确定,但是当谈到接口时我很难理解继承malarky。

鉴于以下类,如何在特定于Parent类的接口中连接Get方法,而不重写基本方法?

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

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

这是我的atm,但我一直得到一个“inteface成员Type1 IParent.Get(string)未实现”错误。

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

5 个答案:

答案 0 :(得分:5)

public T Get<T, T2>(string key)将在泛型类上创建泛型方法。 TT2将成为此通用方法的参数,与类TT2无关。

只需将其public T Get(string key)

答案 1 :(得分:2)

T Get<T,T2>(string)的{​​{1}}方法和Base<T,T2>的方法Type1 Get(string)方法是两种不同的方法签名。你需要实现这两个。如果您希望两种实现都使用相同的功能,则可以执行以下操作:

IParent

但我相信您的原意并不是参数化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 } } 中的方法签名。

当类型无法或不应由包含该方法的类推断时,您只需要对方法输入类型参数(例如IParentT

答案 2 :(得分:2)

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

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

虽然看起来Base.Get共享其类型参数,但它没有,所使用的语法会创建两个新的类型参数,这些参数会影响类的类型参数。

修复方法是在Get中简单地实现一个没有任何类型参数的Parent方法。

答案 3 :(得分: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
{
}

答案 4 :(得分:0)

尝试使用通用IParent接口。