2015-10-29 13 views
5

はスウィフトでは、継承を作成することができます。 B内で関数を作成すると、そのスーパークラスへの参照を得る方法がありますA?私はこれらのすべてを試したし、どれも私のために働いていないSwiftの親/スーパークラスへの参照を取得するには? <code>A</code>からこの例では<code>B</code>継承を</p> <pre><code>class A { } class B:A { } </code></pre> <p>:

self.super 

それとも

self.super() 

それとも

self.parent 

:私はようなものになるだろう考えていました。誰もスーパークラスへの参照を取得する方法を知っていますか?

+1

「スーパークラスへの参照」とはどういう意味ですか?あなたは本当にやろうとしていますか?いくつかのメソッドの継承された_implementation_にアクセスすることができます。通常は誰でも要求できます。あなたは実際の実生活で何をもっとしたいですか? – matt

+0

@mattどのクラスのスーパークラスへの動的参照をして、基本クラスが何であるかを知りたい。そこから、私はそれをインスタンス化したり、何らかのリフレクションを実行したりできるはずです。 –

+0

スイフトにはイントロスペクションがありません。それは慎重だ。あなたはあなたのためにイントロスペクションするようにココアに頼むことができますが、もう一度、あなたがしたいことの本当の例を与えていません。もしこれがBならばあなたは一つのことをしなければならないというアイデアがあり、これがAならば別のことをする必要があるということであれば、多形性がそれを処理します。たとえば、最初に何を開始するかによって、AまたはBをインスタンス化するファクトリ関数を簡単に書くことができます。また、最後に、あなたが何をしたいのか尋ねます。 – matt

答えて

0
class A { 
    func f() { 
     print("A") 
    } 
} 
class B : A { 
    override func f() { 
     print("B") 
     super.f() 
    } 
} 
let b = B() 
b.f() 
1

Objective-Cランタイムをインポートしてからclass_getSuperclass()を使用する必要があります。

import ObjectiveC 

class A {} 

class B:A { 
    func mySuper() -> AnyClass { 
     return class_getSuperclass(self.dynamicType) 
    } 
} 

B().mySuper() // A.Type 

これは、デバッグとロギング以外のものではお勧めできません。それでも、それは非常に不安定であり、追求する前に深く考え直すべきです。このようなサブクラス化でさえ、かなり不安定です。 ProtocolsとExtensionは、ほとんどの場合、純粋なSwiftの継承より優れたソリューションです(継承を持たないので、スーパークラスについては心配する必要はありません)。

+0

AnyClassで何ができますか? – user3441734

+1

AnyClassで何をしたいですか?それを調べたり、メッセージを送信したり、他のクラスと比較したり、ジェネリック関数を特化するために使うことができます。これはSwiftタイプです。 –

+0

実際の例を示してください。 – user3441734

0
class A { 
    var type: AnyClass { return A.self } 
} 

class B : A { 
    override var type: AnyClass { return B.self } 
    var superType: AnyClass { return super.type} 
} 

let type = B().type 
let superType = B().superType 
0

与えられたクラスABは、私はちょうどObjectiveCをインポートした後Bself.superclassを呼び出すことができました。