※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

結果からいえば、継承後、継承元に触ることは不可能である。
つまり次のコードは動かない。

code[C#]:

class EntryPoint
{
public static void Main(string[] args)
{
SubOuter outer = new SubOuter();
SubOuter.SubInner inner = new SubOuter.SubInner();
inner.SuperInnerMethodCaller(outer);
}
}

class SuperOuter
{
protected void SuperOuterMethod()
{
System.Console.WriteLine("SuperOuter method Called");
}

public class SuperInner
{

}
}

class SubOuter : SuperOuter
{
public class SubInner : SuperInner
{
public void SuperInnerMethodCaller(SuperOuter outer)
{
outer.SuperOuterMethod();
}
}
}

EndCode


それどころか次のコードも動かない。


Code[C#]:

class EntryPoint
{
public static void Main(string[] args)
{
SubOuter outer = new SubOuter();
SubOuter.SubInner inner = new SubOuter.SubInner();
inner.SuperInnerMethodCaller(outer);
}
}

abstract class SuperOuter
{
protected abstract void SuperOuterMethod();

public class SuperInner
{

}
}

class SubOuter : SuperOuter
{
protected override void SuperOuterMethod()
{
System.Console.WriteLine("SubOuter Overrided method Called");
}

public class SubInner : SuperInner
{
public void SuperInnerMethodCaller(SuperOuter outer)
{
outer.SuperOuterMethod();
}
}
}

EndCode

後者は僕的には動いてもいいのに、と思ったが危険な局面もあるのだろう。
つまりこういうときは継承前にメソッドデリゲートの取得パスを入手しておくべきなのだ。
継承元でかなり、みっちり設計する必要があるが。。
次のコードが動作するので、こういう場合そうするべきだってことだ。


class EntryPoint
{
  public static void Main(string[] args)
  {
SubOuter outer = new SubOuter();
SubOuter.SubInner inner = new SubOuter.SubInner();
inner.SuperInnerMethodCaller(outer);
  }
}

abstract class SuperOuter
{
protected abstract void SuperOuterMethod();

public class SuperInner
{
protected void OuterMethodCaller(SuperOuter outer)
{
outer.SuperOuterMethod();
}
}
}

class SubOuter : SuperOuter
{
protected override void SuperOuterMethod()
{
System.Console.WriteLine("SubOuter Overrided method Called");
}

public class SubInner : SuperInner
{
public void SuperInnerMethodCaller(SuperOuter outer)
{
this.OuterMethodCaller(outer);
}
}
}

EndCode

これは動く。
つまり、継承しなければいいのだ。


以上。

PS:
コーディングは適当にやったんで、かなりコンパイル時エラーがあると思う。
ニュアンスが伝わればいいと思っているが、もしそういうものを見つけたら
直しておいてくれるとうれしい。




| 新しいページ | 編集 | 差分 | 編集履歴 | ページ名変更 | アップロード | 検索 | ページ一覧 | タグ | RSS | ご利用ガイド | 管理者に問合せ |
@wiki - 無料レンタルウィキサービス | プライバシーポリシー