forked from: 複数の継承元インターフェースに同名メソッドを定義した場合の実験
forked from 複数の継承元インターフェースに同名メソッドを定義した場合の実験 (diff: 13)
インターフェースを多重継承した場合、 複数の継承元インターフェースに同名のメソッドを使用できるか実験。 結果、インスタンスを設定する変数の型によって、コンパイルできるできないが分かれる。 TestならOKで、ISubならエラーである理由が分からない。 どのインターフェースで定義されたメソッドであるかを キャストによって指定してやるとエラーにならないっぽい。 参照したメンバの前に「インターフェース名::」をつけても良いみたい。
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;
}
