2017-02-23 5 views
1

Ich habe 1 abstrakte Klasse "A" und einige geerbte Klassen AA, AB ... etc. Es wird etwa 15 vererbte Klassen überhaupt sein.Aufruf Methode der Unterklasse Klasse von Instanz der Oberklasse

Variable "Punkt" ist ein Objekt einer der geerbten Klassen, aber ich weiß nicht welche, also am Anfang definiere ich es als "A".

Hier ist ein Code:

import Foundation 

class A { 

    func callA() {} 
} 

var point:A 

class AA:A { 

    func callAA() -> String { return "AA" } 
} 

class AB:A { 

    func callAB() -> String { return "AB" } 
} 

Now "Punkt" ist "AB" Instanz und ich möchte Methode der "AB" Klasse nennen, aber es den Fehler erzeugen: Value of type 'A' has no member 'callAB'

point = AB() // Correct 
point.callAB() // Error 

Wie kann ich in diesem Fall die Methode "callAB" aufrufen?

Ich will nicht zu:

  • definieren „CalLab“ Methode in der Klasse „A“ und es in der Klasse „AB“ außer Kraft setzen, da einige geerbte Klassen der Klasse „A“ diese Methode nicht enthalten .
  • schreiben etwas wie folgt aus:

    if point is AB { 
    
        (point as! AB).callAB() 
    } 
    

    weil es eine Menge von geerbten Klassen sind, und ich werde eine von ihnen zu überprüfen.

Antwort

0

können Sie optional gesenkten verwenden + optional Verkettung wie folgt aus:

(point as? AB)?.callAB() 

Wenn der Punkt nicht eine Instanz von AB ist, wird nichts

passieren Wenn Sie verschiedene Methoden aufrufen, tun müssen, um in Abhängigkeit auf Punkt Art, können Sie auch switch wie folgt verwenden:

switch point { 
    case let aa as AA: aa.callAA() 
    case let ab as AB: ab.callAB() 
    default: break 
} 
+0

ich w Anted, um zu vermeiden, jede Klasse zu überprüfen, aber es scheint mir jetzt ist es unvermeidlich. Vielen Dank. – Soloqub

0

Sie können nur durch explizite Konvertierung aufrufen.

if let pointab = point as? AB { 
    pointab.callAB() 
}else if let pointaa = point as? AA { 
    pointaa.callAA() 
}else{ 
    // something other 
} 
Verwandte Themen