상속받은 인스턴스 메소드에서 멤버의 접근

Programming/ActionScript 2.0 2007. 2. 21. 10:55

[상속받은 인스턴스 메소드에서 멤버의 접근]
====================
멤버 접근:
서브클래스의 인스턴스 메소드

예제 :
class A{
        public function methOfA():Void{
                methOfB(); //Error!
        }
}

class B extends A{
        public function methOfB():Void{
        }
}

설명 :
컴파일타임 오류 발생. 슈퍼클래스의 메소드는 서브클래스에 정의된 메소드를 참조할 수 없다. 그리고 클래스 A는 methOfB()를 정의하지 않았기 때문에 참조하지 못한다.
====================
멤버 접근 :
상속받은 인스턴스 메소드(슈퍼클래스에 정의됨)

예제 :
class A{
        public function methOfA():Void{
                //Executes otherMethOfA()
                otherMethOfA();
        }
        public function otherMethOfA():Void{
        }
}

class B extends A{
}

// 사용법
var bInstance:B = new B();
bInstance.methOfA();
//정상적으로 실행된다.

설명 :
어떤 클래스의 메소드가 동일한 클래스의 다른 메소드를 호출하는 것은 가능하다. 서브클래스의 인스턴스를 통해 사용하더라도 호출할 수 있다.

====================
멤버 접근 :
오버라이드된 인스턴스 메소드(슈퍼클래스와 서브클래스에 모두 정의됨)

예제 :
class A{
        public function methOfA():Void{
                // 클래스 B의 인스턴스에서 실행하면 B의 overriddenMeth()가 호출된다. 클래스 A의 인스턴스에서 실행하면 A의 overriddenMeth()가 호출된다.
                overriddenMeth();
        }
        public function overriddenMeth():Void{
        }
}

class B extends A{
        public function overriddenMeth():Void{
        }
}
//사용법
var aInstance:A = new A();
var bInstance:B = new B();
// A의 overriddenMeth()가 싱행된다.
aInstance.methOfA();
// B의 overriddenMeth()가 실행된다.
bInstance.methOfA();

설명 :
오버라이드된 메소드는 클래스의 인스턴스에 따라서 사용하는 대상이 달라진다.

====================
멤버 접근 :
서브클래스의 인스턴스 속성

예제 :
class A{
        public function methOfA():Void{
                trace(propOfB); // 오류발생!
        }
}

class B extends A{
        public var propOfB:Number = 1;
}

설명 :
컴파일타임 에러 발생. 슈퍼클래스의 메소드는 서브클래스에 정의된 속성을 참조할 수 없다. 클래스 A에는 propOfB가 없으므로 사용할 수 없다.
====================
멤버 접근 :
상속받은 인스턴스 속성(슈퍼클래스에 정의됨)

예제 :
class A{
        public var propOfA:Number = 2;
        public function methOfA():Void{
                trace(propOfA); //출력: 2
        }
}

class B extends A{
}

설명 :
methOfA()와 같은 슈퍼클래스의 메소드는 슈퍼클래스의 속성(propOfA와 같은)에 접근할 수 있다.
====================
멤버 접근 :
오버라이드된 인스턴스 속성(슈퍼클래스와 서브클래스에 모두 정의됨)

예제 :
class A{
        public var overriddenProp:Number = 3;
        public function methOfA():Void{
                trace(overriddenProp);
        }
}

class B extends A{
        public var overriddenProp:Number = 4;
}

// 사용법
var aInstance:A = new A();
var bInstance:B = new B();
aInstance.methOfA(); // 출력 : 3
bInstance.methOfA(); // 출력 : 4

설명 :
비록 클래스 A에서 속성을 접근하지만 B인스턴스에서 methOfA()를 실행하면, 서브클래스에서 오버라이드된 속성의 값(3이 아닌 4)을 사용한다. 왜냐하면 bInstance는 overriddenProp에 단 한 개의 값만을 저장할 수 있기 때문이다.(자바에서는 methOfA()를 실행하면 항상 3을 출력한다.)

====================
멤버 접근 :
서브클래스의 클래스메소드, 불분명한 참조

예제 :
class A{
        public function methOfA():Void{
                classMethOfB(); // 오류발생!
        }
}

class B extends A{
        public static function classMethOfB():Void{
        }
}

설명 :
컴파일타임 에러 발생. classMethOfB()는 클래스 A에 정의하지 않았고, 슈퍼클래스는 불분명한 참조를 통해 서브클래스에 존재하는 클래스 메소드를 참조할 수 없다
====================
멤버 접근 :
서브클래스의 클래스메소드 분명한 참조

예제 :
class A{
        public function methOfA():Void{
                B.classMethOfB(); // 정상적으로 실행된다.
        }
}

class B extends A{
        public static function classMethOfB():Void{
        }
}

설명 :
B.classMethOfB()는 분명한 참조로서, 컴파일러는 클래스 B에 해당 클래스 메소드가 존재하는 것을 파악할 수 있다(A의 서브클래스 B가 아니라 할지라도, 모든 클래스에서 이와 같이 사용할 수 있다).

====================
멤버 접근 :
상속받은 클래스 메소드(슈퍼클래스에 정의됨)

예제 :
class A{
        public static function classMethOfA():Void{
        }
        public function methOfA():Void{
                //A.classMethOfA()를 실행
                classMethOfA();
        }
}

class B extends A{
}

// 사용법
var bInstance:B = new B();
bInstance.methOfA();
//A.classMethOfA()를 실행

설명 :
컴파일 과정에서 클래스 메소드의 불분명한 참조는 현재 클래스가 어떤 것인가에 따라 결정된다. 따라서 classMethOfA()는 A.classMethOfA()를 참조한다. 서브클래스 B의 인스턴스에서 A.classMethOfA()를 실행하면 정상적으로 동작한다.
====================
멤버 접근 :
오버라이드된 클래스 메소드(슈퍼클래스와 서브클래스에서 모두 정의됨)

예제 :
class A{
        public static function overriddenClassMeth():Void{
        }
        public function methOfA():Void{
                //A.overriddenClassMeth()를 실행
                overriddenClassMeth();
        }
}

class B extends A{
}

//사용법
var bInstance:B = new B();
//A.overriddenClassMeth()를 실행
bInstaince.methOfA();

설명 :
컴파일 과정에서 클래스 메소드의 불분명한 참조는 현재 클래스가 어떤 것인가에 따라 결정된다. 클래스 A에서 overriddenClassMeth()는 A.overriddenClassMeth()로 변경된다. 클래스 A는클래스 B에 존재하는 B.overriddenClassMeth()를 실행할 수 있다.
====================
* 클래스 메소드와 마찬가지로 클래스 속성에 대해서도 동일한 접근 규칙을 사용함.


출처 : 콜린무크의 Flash ActionScript 2.0에서 발췌

    

설정

트랙백

댓글