2016-09-23 4 views
1

У меня есть следующая ситуация: реальный код намного больше, но это дает приятную сумму ситуации. (Если вы хотите знать, использование этого иметь динамически загружен UICollectionView):Swift: родительский класс возвращает родительские свойства класса

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 возвращается " А». Я проверил в отладчик и функция выполняется правильно, тип, возвращаемый С2 В.

Я использую XCode 7.3 с Swift 2.2

ответ

1

Это потому, что расширения протокола не являются полиморфными. Реализация name в расширении для протокола, и читает:

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

Self является усыновитель. Кто это принимает? Это A:

class A: P { 
} 

И это далеко не все; Self в этом контексте не интерпретируется полиморфно. Если вы хотите полиморфизм, вам нужно будет реализовать name в самих классах - так же, как вы делали с getName.

+0

Хорошо, получилось, я просто реализую необходимые методы в классе ребенка, спасибо! – whtman

Смежные вопросы