2017-02-23 4 views
1

나는 1 개의 추상 클래스 "A"와 몇개의 상속 된 클래스 AA, AB ... 등을 가지고있다. 그것은 상속받은 클래스가 약 15 개일 것이다.수퍼 클래스의 인스턴스에 의한 서브 클래스 클래스의 호출 메소드

변수 "point"는 상속 된 클래스 중 하나의 개체이지만 어떤 개체인지는 모르므로 처음에는 "A"로 정의합니다. 여기

코드입니다 :

이제
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" } 
} 

"포인트" "AB"예를 내가 "AB"클래스의 메소드를 호출 할,하지만 오류 발생 : Value of type 'A' has no member 'callAB'

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

이 경우 "callAB"메서드를 어떻게 호출 할 수 있습니까?

나는 싶지 않아 :

  • 클래스의 상속 클래스 중 일부는 "A"이 방법을 포함 할 수 없습니다 때문에 "callAB"방법 클래스의 "A"를 정의하고 클래스 "AB"에 재정의 . 이 같은
  • 쓰기 뭔가 :이 상속 클래스를 많이하고 내가 그들 중 하나를 확인해야합니다

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

    때문이다.

답변

0

이 같은 선택 낙심 + 옵션 체인을 사용할 수 있습니다

(point as? AB)?.callAB() 

를 점 AB의 인스턴스가 아닌 경우는, 아무것도

일어날 것 당신이 따라 다른 메소드를 호출 할 필요가있는 경우 포인트 유형의 경우 다음과 같이 switch을 사용할 수도 있습니다.

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

각 클래스를 확인하지 않으려 고하지만, 지금은 필연적입니다. 감사. – Soloqub

0

명시 적 변환으로 만 호출 할 수 있습니다.

if let pointab = point as? AB { 
    pointab.callAB() 
}else if let pointaa = point as? AA { 
    pointaa.callAA() 
}else{ 
    // something other 
} 
관련 문제