【发布时间】:2015-01-16 19:28:01
【问题描述】:
我正在尝试在类型之间实现一种不平凡的(至少对于我的级别而言)关系。
A 类和 B 类是 MySuperClass 类的子类,我让它们实现协议“MyProtocol”
class MySuperclass {...}
protocol MyProtocol {
func myProtocolMethod()
}
class A:MySuperclass, MyProtocol {...}
class B:MySuperclass, MyProtocol {...}
我的“容器”类有一个变量 x,它可以是 A 或 B 的实例
class Container {... var x:???? ....}
从 ????我的问题是我希望我可以将 x 用作 MyProtocol 和 MySuperclass。
就在今天,我在this thread 中解决了一个非常相似的问题,我想我可以在这里应用它,但我没有成功。
我们的想法是声明变量的类型,使其满足约束<T where T:MySuperclass, T:MyProtocol>,但我应该把它放在哪里?到目前为止我所尝试的一切都没有真正的意义并且失败了。
我试过了,例如:
class Container<T where T:MySuperclass, T:MyProtocol>
class Container {... var x:T ...}
但我在Container 中实例化并分配 T,当我这样做时,我得到一个编译器错误:
class Container {... self.x = A() ....}
“类型 A 不能转换为 'T'”
但实际上应该,因为 A 满足类型约束。
编辑:感谢arshajii's anwer 我明白为什么这是不可能的。但我仍然需要知道如何解决我最初的问题。
我不知道泛型是否真的是正确的方法。我想我并不真的需要一个类型变量,我需要的是一个聚合类型之类的东西......
编辑 2- 我知道我可以通过实现一个子类来实现这一点。只是想知道是否有其他方法。但重新考虑子类似乎是最好的方法。
提前致谢。
【问题讨论】: