【发布时间】:2016-11-23 09:17:46
【问题描述】:
我有接口和派生它的 3 个类,但是如何为每种类型使用 1 个变量?
public interface IBuilder<T> where T: System.IConvertible{}
public class SimpleBuilder : IBuilder<SimpleCollagePatterns>{}
public class CreativeBuilder : IBuilder<CreativeCollagePatterns>{}
public class ShapeBuilder : IBuilder<ShapeCollagePatterns>{}
而且我需要在必要时创建类的实例
我有 IBuilder<IConvertible> currentBuilder 变量,但我无法创建任何 Builder 的实例
this.currentBuilder = new SimpleBuilder(); //Doesn`t work
只有当我将 IBuilder<IConvertible> currentBuilder 更改为 IBuilder<SimpleCollagePatterns> currentBuilder 或其他类型时,我才能创建这种类型的 Builder,但我需要让 ability 创建任何类型
【问题讨论】:
-
接口不是类,所以你不能创建它们的实例。创建实例的唯一方法是您选择的方式,即定义实现接口的类,例如简单拼贴图案。此外,接口不包含任何执行特定操作的代码,那么您为什么要创建它们的实例呢?为什么不将 IBuilder 更改为父类?
-
你面临的问题是你有
I<T1>和I<T2>(即同一个泛型接口使用了两次不同的泛型参数),并且T1之间存在继承层次结构和T2。问题是I<T1>和I<T2>之间没有继承层次结构。您可以根据继承的方式使用协变和逆变来处理此问题,但这对类型的使用施加了非常具体的限制,可能不是您想要的。简而言之,这是不可能的。