class Vehicle{
    var currentSpeed = 0.0
    var description:String{
        return "시간당 \\(self.currentSpeed)로 움직이는 중입니다."
    }
    
    func makeNoise(){
        
    }
}

class Car:Vehicle{
    var gear = 0
    var engineLevel = 0
    
    override var currentSpeed: Double{
        get{
            return Double(self.engineLevel * 50)
        }
        set{
            
        }
    }
    
    override var description: String{
        get{
            return "Car : engineLevel=\\(self.engineLevel), so currentSpeed=\\(self.currentSpeed)"
        }
        set{
            print("New value is \\(newValue)")
        }
    }
}
let c:Vehicle = Car()

let 변수명:부모타입 = 자식()으로 선언가능

let 변수명:자식 = 부모() → 거꾸로 가는건 불가능

상위 클래스로 타입을 선언 할 수록 사용할 수 있는 메소드 프로퍼티는 감소.

class Car : Vehicle{
    
}

class SUV : Car{
    var fourWheel = false
}

let jeep : Vehicle = SUV()
print(jeep.fourWheel) //value of type Vehicle has  no member fourWheel ERROR

jeep은 SUV로 초기화 했지만 fourWheel에 접근 불가능

업 캐스팅 다운 캐스팅

업 캐스팅(Up Casting)

자식 as 부모 

다운 캐스팅(Down Casting)