我试图写两个课程,打电话给父母和孩子。
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;返回类型而不使类通用?
答案 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()
{
}
}