定义符合多个协议/协议+超类的变量

时间:2015-01-15 21:04:34

标签: generics swift

我试图在类型之间实现一个不平凡的事情(至少在我的关卡中)。

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() ....}

&#34; A类不可转换为&#39;&#39;&#34;&#34;

但实际上它应该,因为A满足类型约束。

编辑:感谢arshajii's anwer我理解为什么这是不可能的。但我仍然需要知道如何解决我最初的问题。

我不知道仿制药是否真的是正确的方法。我想我真的不需要一个类型变量,我需要的是类似聚合类型......

编辑2-我知道我可以通过实现一个子类来实现它。只是想知道是否还有其他方法。但是再想一个子类似乎是最好的方法。

提前致谢。

3 个答案:

答案 0 :(得分:3)

T可能是与FooImpl2完全无关的其他类型(例如FooImpl):

           Foo
          /   \
    FooImpl   FooImpl2

无法将Foo实例分配给FooImpl2类型的(潜在)变量,因此会出错。

答案 1 :(得分:0)

这只是解决此类问题的策略之一。

// declare Protocol of MySuperClass type
protocol MySuperClassType {
    func mySuperClassMethod()
}

// Make the superclass conforms to it.
class MySuperclass: MySuperClassType {
//                  ^^^^^^^^^^^^^^^^
    func mySuperClassMethod() {}
}

protocol MyProtocol {
    func myProtocolMethod()
}

class A: MySuperclass, MyProtocol {
    func myProtocolMethod() { }
}

class B: MySuperclass, MyProtocol {
    func myProtocolMethod() { }
}

class Container {

    // use "Protocol Composition" to declare the property.
    var x: protocol<MySuperClassType, MyProtocol>

    // ...
}

答案 2 :(得分:0)

class Container {... var x: protocol<MySuperclassProtocol, MyProtocol> ....}

确保MySuperclass符合MySuperclassProtocol