2016-09-23 11 views
1

私は以下のような状況がありますが、実際のコードはこれ以上ですが、これは状況の良い和を提供します。 (あなたがこれを使用することを不思議に思っている動的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.

である私は、プロトコルの拡張機能が多型ではないためにですスウィフト2.2

答えて

1

ではXCode 7.3を使用しています。 nameの実装では、プロトコルの拡張であり、読み出し:

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

Selfが採用されます。 Pを採用するのは誰ですか?それはA:

class A: P { 
} 

これまでのことです。この文脈におけるSelfは多型的に解釈されない。多態性が必要な場合は、getNameと同じように、クラス自体にnameを実装する必要があります。

+0

これで、子クラスに必要なメソッドを実装するだけです。ありがとう! – whtman

関連する問題