【发布时间】:2022-09-30 21:48:26
【问题描述】:
我知道之前已经提出了多个类似的问题,但是我仍然相信这个特定的问题还没有解决。
有一个类Super 和一个泛型类Foo<T> : Super,它们都来自第三方库。我需要扩展Foo<T> 的功能,所以我有这个通用类:
public class Bar<T, U> : Foo<T> {
public void DoSomething() { ... }
// Other things that use T and U
}
我现在想要一个“酒吧”的集合(列表),并且能够在所有这些上调用 DoSomething。所以从逻辑上讲,当调用 void 方法时,我不关心 Bar 的类型参数,因为它在那种情况下是无关紧要的。
此外,第三方库还公开了以下方法:
public LibraryMethod(Super super) { ... }
而且我需要能够用我的任何“酒吧”来调用该方法。
非解决方案 1:接口
我不能使用接口的原因是,因为第三方库在它暴露的一些方法中期望Super,并且接口可以被任何类实现,所以我不能使用我的Bar\'s as Super \'s 即使每个 Bar(无论它的类型参数是什么)都必须是 Super。该接口基本上破坏了这里的继承链,我不能再将我的“Bar”传递给期望 Super 的方法。
非解决方案 2:非泛型基类
显然我不能让Bar<T, U> 继承自非泛型基类,原因与上述相同。它也会破坏继承链。
虚构的理想情况
在理想情况下,我可以这样做:
List<Bar<>> bars = new List<Bar<>>();
bars.Add(new Bar<Type1, Type2>());
bars.Add(new Bar<Type3, Type4>());
foreach (Bar<> bar in bars) {
bar.DoSomething();
}
LibraryMethod(bars[0]);
-
为什么不能像
public interface IBar { void DoSomething(); }这样声明一个接口,然后像foreach (IBar bar in listy) { bar.DoSomething(); }一样使用它 -
好吧,你总是可以将它转换为不同的类型,所以这仍然不能解释为什么接口不起作用。也许您可以发布更多代码来更好地解释您的问题。
-
LibraryMethod()在哪里声明?这很重要,因为您可能能够利用编译器为方法提供的自动类型参数解析。 -
我不明白问题是什么。所有
Bar<T,U>派生自Foo<T>,而Foo<T>派生自Super。所以你用所有的酒吧打电话给LibraryMethod(Super super)。请解释问题是什么。 -
@JohnAlexiou OP 想要具有两种类型限制 (
MyList<T, R1,R2>where T:R1, T:R2) 的列表,支持迭代“列表”为IEnumerable<R1>和IEnumerable<R2>... 但由于 C# 不是 Java,他们甚至有问题将这些项目添加到初始列表中,但目前专注于从两种类型调用方法......(这就是我看到问题的方式)。
标签: c# generics generic-type-argument