どうも無理やり押し込んだ感のある文法が好きになれない。
この場合、ローカル変数 localnum を
感覚的に参照出来るそうに見えるが、実際はできない。
その点、C#は、デリゲートやアクセッサがいい役割を果たしていて
かなり感覚的に読みやすいコードが書けるのでオススメだ。
public class Main implements InterfaceA
{
private int classnum = 10;
public void Test()
{
// パッと見でローカル変数も送れそうな感じがするが送れない
int localnum = 10;
// その場でインターフェースを実装
ClassA a = new ClassA( new InterfaceA()
{
// 実装2
@Override
public void play()
{
//System.out.println("実装1, num=" + localnum); // 当然ローカル変数は NG
System.out.println("実装1, num=" + classnum);
}
});
a.play(); // 実装1がよばれる
// 通常
ClassA b = new ClassA();
b.setInterfaceA(this);
b.play(); // 実装2がよばれる
}
@Override
public void play()
{
System.out.println("実装2, num=" + classnum);
}
}
※補足
最近知ったのですが、C# 2.0 では匿名メソッドという機能が用意されていて
上記と似たようなかたちで、delegateに直接関数を実装できるようです。
0 件のコメント:
コメントを投稿