Swift:子类返回父类属性

时间:2016-09-23 16:22:50

标签: swift swift2

我有以下情况,真正的代码更多,但这提供了一个很好的总和的情况。 (如果您想知道这是使用动态加载的UICollectionView):

protocol P {
    static var name: String {get}
}

extension P {
    static var name: String {
       return String(Self)
    }
}

protocol P2 {
    getType() -> P.Type
    getName() -> String
}

class A: P {
}

class B: A {
}

class C1: P2 {
    func getType() -> P.Type {
       return A.self
    }

    func getName() -> String {
       return A.name
    }
}

class C2: P2 {
    func getType() -> P.Type {
       return B.self
    }

    func getName() -> String {
       return B.name
    }
}

现在发生的事情如下:

 C1.getType().name //"A" as expected
 C1.getName()      //"A" as expected
 C2.getType().name //"A" why?
 C2.getName()      //"B" as expected

我没有任何线索为什么C2.getType.name返回“A”。我检查了调试器并正确执行了函数,C2返回的类型是B。

我正在使用XCode 7.3和Swift 2.2

1 个答案:

答案 0 :(得分:1)

这是因为协议扩展不是多态的。 name的实现在协议扩展中,并显示为:

static var name: String {
   return String(Self)
}

Self是采用者。谁采用P?这是A:

class A: P {
}

这就是事情的发展;在此上下文中Self不是多态解释。如果你想要多态,你需要在类本身中实现name - 就像你使用getName一样。