function, var 또는 const 등 정의에 사용된 키워드에 관계없이 인스턴스 속성은 기본 클래스에서 private 특성으로 선언되어 있지 않으면 모든 하위 클래스에 상속됩니다. 예를 들어 ActionScript 3.0의 Event 클래스에는 모든 이벤트 객체에 공통되는 속성을 상속하는 여러 하위 클래스가 있습니다.
일부 이벤트 유형의 경우에는 Event 클래스에 이벤트를 정의하는 데 필요한 모든 속성이 들어 있습니다. 이러한 이벤트 유형에는 Event 클래스에 정의된 인스턴스 속성 이외에 추가 속성이 필요하지 않습니다. 이러한 이벤트의 예로는 데이터가 성공적으로 로드될 때 발생하는 complete 이벤트 및 네트워크 연결이 설정될 때 발생하는 connect 이벤트가 있습니다.
다음은 Event 클래스에서 인용한 코드로서 하위 클래스로 상속되는 속성 및 메서드 중 일부를 보여 줍니다. 이러한 속성은 상속되므로 모든 하위 클래스의 인스턴스에서 속성에 액세스할 수 있습니다.
public class Event
{
public function get type():String;
public function get bubbles():Boolean;
...
public function stopPropagation():void {}
public function stopImmediatePropagation():void {}
public function preventDefault():void {}
public function isDefaultPrevented():Boolean {}
...
}
Event 클래스에 없는 고유 속성이 필요한 이벤트 유형도 있습니다. 이러한 이벤트는 Event 클래스에 정의된 속성에 새 속성을 추가할 수 있도록 Event 클래스의 하위 클래스를 통해 정의됩니다. 이러한 하위 클래스의 예로는 마우스 이동이나 마우스 클릭에 관련된 mouseMove 및 click 등의 이벤트에 고유한 속성을 추가하는 MouseEvent 클래스가 있습니다. 다음은 MouseEvent 클래스에서 인용한 코드로서 기본 클래스에는 없고 하위 클래스에만 있는 속성의 정의를 보여 줍니다.
public class MouseEvent extends Event
{
public static const CLICK:String= "click";
public static const MOUSE_MOVE:String = "mouseMove";
...
public function get stageX():Number {}
public function get stageY():Number {}
...
}
액세스 제어 지정자와 상속
public 키워드로 선언된 속성은 코드의 모든 위치에서 참조할 수 있습니다. 즉, public 키워드는 private, protected 및 internal 키워드와 달리 속성 상속에 제한이 없습니다.
private 키워드로 선언된 속성은 해당 속성이 정의된 클래스 내에서만 참조할 수 있으므로 하위 클래스로 상속되지 않습니다. 이 비헤이비어는 private 키워드가 ActionScript 3.0의 protected 키워드와 비슷하게 작동했던 이전 버전의 ActionScript와 다릅니다.
protected 키워드는 속성이 정의된 클래스뿐만 아니라 모든 하위 클래스에서도 속성을 참조할 수 있음을 나타냅니다. Java 프로그래밍 언어의 protected 키워드와 달리 ActionScript 3.0에서는 protected 키워드를 사용하는 경우 같은 패키지의 다른 모든 클래스에서 해당 속성을 참조할 수 없습니다. ActionScript 3.0에서는 하위 클래스에서만 protected 키워드로 선언된 속성에 액세스할 수 있습니다. 또한 하위 클래스가 기본 클래스와 같은 패키지에 있는지 또는 다른 패키지에 있는지에 관계없이 하위 클래스에서 protected 속성을 참조할 수 있습니다.
속성이 정의된 패키지 내에서만 속성을 참조할 수 있게 하려면 internal 키워드를 사용하거나 액세스 제어 지정자를 사용하지 않습니다. internal 액세스 제어 지정자는 키워드가 지정되지 않은 경우에 적용되는 기본 액세스 제어 지정자입니다. internal로 표시된 속성은 같은 패키지 안에 있는 하위 클래스에만 상속됩니다.
다음 예제를 통해 각 액세스 제어 지정자가 패키지 경계를 벗어나는 상속에 주는 영향을 확인할 수 있습니다. 다음 코드에서는 AccessControl이라는 기본 응용 프로그램 클래스 및 Base와 Extender라는 기타 클래스 두 개를 정의합니다. Base 클래스는 foo라는 패키지에 있고, Base 클래스의 하위 클래스인 Extender 클래스는 bar라는 패키지에 있습니다. AccessControl 클래스에서는 Extender 클래스만 가져와서 Extender의 인스턴스를 만들고, 이 인스턴스에서는 Base 클래스에 정의된 str이라는 변수에 액세스합니다. str 변수는 public으로 선언되어 있으므로 이 코드는 다음과 같이 컴파일 및 실행됩니다.
// Base.as in a folder named foo
package foo
{
public class Base
{
public var str:String = "hello"; // change public on this line
}
}
// Extender.as in a folder named bar
package bar
{
import foo.Base;
public class Extender extends Base
{
public function getString():String {
return str;
}
}
}
// main application class in file named AccessControl.as
package
{
import flash.display.MovieClip;
import bar.Extender;
public class AccessControl extends MovieClip
{
public function AccessControl()
{
var myExt:Extender = new Extender();
trace(myExt.str);// error if str is not public
trace(myExt.getString()); // error if str is private or internal
}
}
}
다른 액세스 제어 지정자가 이전 예제의 컴파일 및 실행에 주는 영향을 확인하려면 AccessControl 클래스에서 다음 행을 삭제하거나 주석 처리한 후 str 변수의 액세스 제어 지정자를 private, protected 또는 internal로 변경합니다.
trace(myExt.str);// error if str is not public
변수는 재정의할 수 없음
var 또는 const 키워드로 선언된 속성은 상속되지만 재정의할 수는 없습니다. 속성을 재정의한다는 것은 하위 클래스에서 속성을 다시 정의함을 의미합니다. 재정의할 수 있는 속성 유형은 function 키워드로 선언된 속성인 get 및 set 접근자뿐입니다. 인스턴스 변수는 재정의할 수 없지만 인스턴스 변수에 대한 getter 및 setter 메서드를 만들고 해당 메서드를 재정의하면 비슷한 기능을 달성할 수 있습니다.