2015-10-29 21 views
5

w Swift można utworzyć dziedziczenia:Jak uzyskać odniesienie do rodzica/super klasy w Swift?

class A { 

} 

class B:A { 

} 

W tym przykładzie B dziedziczy A. Jeśli utworzę funkcję w B, czy mogę uzyskać odniesienie do jej super klasy A? Myślałam, że będzie coś takiego:

self.super 

Albo

self.super() 

Albo

self.parent 

Próbowałem wszystkie z nich i nikt pracował dla mnie. Czy ktoś wie, jak uzyskać odniesienie do super klasy?

+1

Co masz na myśli przez "odniesienie do swojej nadklasy"? Co tak naprawdę próbujesz zrobić? Możesz uzyskać dostęp do odziedziczonej _implementacji_ jakiejś metody - zwykle jest to wszystko, o co poprosi każdy. Czegóż więcej chcesz w praktycznym życiu? – matt

+0

@matt Chcę dynamicznego odniesienia do super klasy dowolnej klasy, aby dowiedzieć się, jaka jest klasa podstawowa. Stamtąd zakładam, że powinienem móc go utworzyć lub przeprowadzić jakąś refleksję na ten temat. –

+0

Swift nie ma introspekcji; to jest celowe. Możesz poprosić Cocoa o introspekcję, ale nie podałeś prawdziwego przykładu tego, co chcesz zrobić. Jeśli chodzi o to, że powinieneś zrobić jedną rzecz, jeśli jest to B, a jeśli jest to A, to zajmuje się tym polimorfizm. Na przykład można łatwo napisać funkcję fabryczną, która tworzy wystąpienia A lub B w zależności od tego, od czego zaczynamy. Znowu, i po raz ostatni, pytam cię, co tak naprawdę chcesz zrobić. – matt

Odpowiedz

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

trzeba importować Objective-C czas pracy, a następnie można użyć class_getSuperclass().

import ObjectiveC 

class A {} 

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

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

Jest bardzo mało prawdopodobne, aby był to dobry pomysł na cokolwiek innego niż debugowanie i rejestrowanie. Nawet wtedy jest to bardzo nie-podobne do Swift i powinieneś głęboko przemyśleć swój problem, zanim zaczniesz go realizować. Nawet podklasy takie jak ta są całkiem nie-podobne do Swift. Protokoły i rozszerzenia są prawie zawsze lepszym rozwiązaniem niż dziedziczenie w czystej Swift (i bez dziedziczenia, nie ma potrzeby martwić się nadklasami).

+0

co można zrobić z AnyClass ??? – user3441734

+1

Czego * chcesz * robić z AnyClass? Możesz go przejrzeć, wysłać wiadomości, porównać z innymi klasami, wykorzystać do specjalizacji ogólnych funkcji itp. Jest to typ Swift. –

+0

Proszę, pokaż mi jakiś praktyczny przykład. – 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

danej klasy A: B, udało mi się po prostu zadzwonić self.superclass ciągu B po zaimportowaniu ObjectiveC.

Powiązane problemy