4.3.1 메서드 오버라이딩(Overriding Methods)
4.3.1 메서드 오버라이딩(Overriding Methods)
필드 오버라이딩은 클래스 계층을 만드는 데 핵심적이에요. 많은 디자인 패턴이 그것을 활용하지만, 여기서는 기본 기능만 살펴볼게요. 클래스에서 오버라이드를 사용하려면 그 클래스가 부모 클래스(parent class)를 가져야 합니다. 다음 예제를 생각해 봐요:
class Base {
public function new() {}
public function myMethod() {
return "Base";
}
}
class Child extends Base {
public override function myMethod() {
return "Child";
}
}
class Main {
static public function main() {
var child:Base = new Child();
trace(child.myMethod()); // Child
}
}
여기서 중요한 구성 요소는 다음과 같아요:
myMethod메서드와 생성자를 가진Base클래스,Base를 확장하고override로 선언된myMethod메서드를 가진Child클래스,child에Child의 인스턴스를 생성·할당하고myMethod()를 호출하는main메서드를 가진Main클래스.
child 변수는 명시적으로 Base로 타입이 매겨져 있어 중요한 차이를 강조해요: 컴파일 타임에 타입은 Base로 알려져 있지만, 런타임은 여전히 Child 클래스에서 올바른 myMethod 메서드를 찾아요. 필드 접근이 런타임에 동적으로 해석되기 때문입니다.
Child 클래스는 super.methodName()을 호출해 오버라이드한 메서드에 접근할 수 있어요:
class Base {
public function new() {}
public function myMethod() {
return "Base";
}
}
class Child extends Base {
public override function myMethod() {
return "Child";
}
public function callHome() {
return super.myMethod();
}
}
class Main {
static public function main() {
var child = new Child();
trace(child.callHome()); // Base
}
}
상속(Inheritance) 절이 이 개념을 확장해요.
본문
오버라이딩의 기본
override 키워드로 부모 클래스의 메서드를 재정의할 수 있어요. var child:Base = new Child();처럼 부모 타입으로 참조해도 런타임은 실제 객체의 메서드를 호출합니다(동적 해석).
super 호출
super.methodName()으로 부모 클래스의 메서드를 호출할 수 있어요.