forked from: 複数の継承元インターフェースに同名メソッドを定義した場合の実験

by asahiufo forked from 複数の継承元インターフェースに同名メソッドを定義した場合の実験 (diff: 13)
インターフェースを多重継承した場合、
複数の継承元インターフェースに同名のメソッドを使用できるか実験。
結果、インスタンスを設定する変数の型によって、コンパイルできるできないが分かれる。
TestならOKで、ISubならエラーである理由が分からない。

どのインターフェースで定義されたメソッドであるかを
キャストによって指定してやるとエラーにならないっぽい。
参照したメンバの前に「インターフェース名::」をつけても良いみたい。
♥0 | Line 40 | Modified 2010-01-13 02:03:10 | MIT License
play

ActionScript3 source code

/**
 * Copyright asahiufo ( http://wonderfl.net/user/asahiufo )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/y8PC
 */

// forked from asahiufo's 複数の継承元インターフェースに同名メソッドを定義した場合の実験
package
{
	import flash.text.TextField;
	import flash.display.Sprite;
	
	/**
	 * インターフェースを多重継承した場合、
	 * 複数の継承元インターフェースに同名のメソッドを使用できるか実験。
	 * 結果、インスタンスを設定する変数の型によって、コンパイルできるできないが分かれる。
	 * TestならOKで、ISubならエラーである理由が分からない。
	 * 
	 * どのインターフェースで定義されたメソッドであるかを
	 * キャストによって指定してやるとエラーにならないっぽい。
	 * 参照したメンバの前に「インターフェース名::」をつけても良いみたい。
	 */
	public class InterfaceMultiExtendsTest extends Sprite
	{
		public function InterfaceMultiExtendsTest()
		{
			// 型がTestである変数を使うと問題無し
			var test1:Test = new Test();
			test1.x = 10;
			
			// 型がISubである変数を使うとコンパイルエラー
			var test2:ISub = new Test();
			//test2.x = 999; // ←ここでエラー
			
			// 解決策
			(test2 as ISuperA).x = 999;
			ISuperA(test2).x = 999;
			Test(test2).x = 999;
			test2.ISuperA::x = 999;
			test2.ISuperB::x = 999;
		}
	}
}

class Test implements ISub
{
	private var _x:Number = 0;
	
	public function get x():Number { return _x; }
	public function set x(value:Number):void { _x = value; }
	public function get y():Number { return 10; }
}

interface ISub extends ISuperA, ISuperB
{
}

interface ISuperA
{
	function get x():Number;
	function set x(value:Number):void;
}

interface ISuperB
{
	function get x():Number;
	function set x(value:Number):void;
	function get y():Number;
}