結果からいえば、継承後、継承元に触ることは不可能である。
つまり次のコードは動かない。
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:
コーディングは適当にやったんで、かなりコンパイル時エラーがあると思う。
ニュアンスが伝わればいいと思っているが、もしそういうものを見つけたら
直しておいてくれるとうれしい。
つまり次のコードは動かない。
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:
コーディングは適当にやったんで、かなりコンパイル時エラーがあると思う。
ニュアンスが伝わればいいと思っているが、もしそういうものを見つけたら
直しておいてくれるとうれしい。