继承返回泛型类型

时间:2016-06-29 23:12:26

标签: c# generics inheritance

我试图写两个课程,打电话给父母和孩子。

parent是一个抽象类,它定义一个返回(某种)泛型类型

的函数
public abstract class Parent
{
     public abstract KeyValuePair<K,V> foo(someInputs);
}

意图是Child可以覆盖此函数以返回具有不同类型的KeyValuePair作为键和值。

public abstract class Child
{
     public override KeyValuePair<string,int> foo(someInputs)
     {
          return(new KeyValuePair<string,int>(someInput1,someInput2);
     }
}

这实现了向开发孩子(未来我)的用户传达该功能需要返回KeyValuePair的目标,但是我可以自由地使用我想要的任何KeyValuePair。

不幸的是,虽然看起来实现这一目标的唯一方法是使类通用,

public abstract class Parent<K,V>

并将K和V传递给抽象函数。

这意味着当我编写子代时,我需要为类定义相同的类型(现在是通用的)和函数返回。如果它们不匹配,编译器会自行调整(有充分的理由)。

有没有办法让这些&#34;半通用&#34;返回类型而不使类通用?

2 个答案:

答案 0 :(得分:2)

具有不同通用参数的类是完全不同的东西。

KeyValuePair<string, int>

KeyValuePair<string, Graphics>

例如,上述两个KeyValuePairs不可互换。

假设您有2个子课程:

public abstract class Child1 : Parent
{
    public override KeyValuePair<string, int> foo() { ... }
}

public abstract class Child2 : Parent
{
    public override KeyValuePair<string, Graphics> foo() { ... }
}

父类无法在一个声明中满足两个孩子。

  

免费使用我想要的任何KeyValuePair

因此,这种自由在逻辑上是不正确的。

答案 1 :(得分:0)

您可以让孩子实现通用接口和非通用基类(如果需要)吗?

public abstract Parent
{
   // common non-generic methods
}

public interface IFooable<T>
{
    KeyValuePair<string, T> Foo();
}

public class Child1 : Parent, IFooable<int>
{
    public virtual KeyValuePair<string, int> Foo()
    {
    }
}

public class Child2 : Parent, IFooable<string>, IFooable<bool>
{
    public KeyValuePair<string, string> Foo()
    {
    }

    public KeyValuePair<string, bool> Foo()
    {
    }
}