「内部クラスのprotected透過性と継承の関係に関する実験の結果報告」の編集履歴(バックアップ)一覧はこちら
「内部クラスのprotected透過性と継承の関係に関する実験の結果報告」(2006/06/19 (月) 22:31:43) の最新版変更点
追加された行は緑色になります。
削除された行は赤色になります。
結果からいえば、継承後、継承元に触ることは不可能である。<br>
つまり次のコードは動かない。<br>
<br>
code[C#]:<br>
<br>
class EntryPoint<br>
{<br>
public static void Main(string[] args)<br>
{<br>
SubOuter outer = new SubOuter();<br>
SubOuter.SubInner inner = new SubOuter.SubInner();<br>
inner.SuperInnerMethodCaller(outer);<br>
}<br>
}<br>
<br>
class SuperOuter<br>
{<br>
protected void SuperOuterMethod()<br>
{<br>
System.Console.WriteLine("SuperOuter method Called");<br>
}<br>
<br>
public class SuperInner<br>
{<br>
<br>
}<br>
}<br>
<br>
class SubOuter : SuperOuter<br>
{<br>
public class SubInner : SuperInner<br>
{<br>
public void SuperInnerMethodCaller(SuperOuter outer)<br>
{<br>
outer.SuperOuterMethod();<br>
}<br>
}<br>
}<br>
<br>
EndCode<br>
<br>
<br>
それどころか次のコードも動かない。<br>
<br>
<br>
Code[C#]:<br>
<br>
class EntryPoint<br>
{<br>
public static void Main(string[] args)<br>
{<br>
SubOuter outer = new SubOuter();<br>
SubOuter.SubInner inner = new SubOuter.SubInner();<br>
inner.SuperInnerMethodCaller(outer);<br>
}<br>
}<br>
<br>
abstract class SuperOuter<br>
{<br>
protected abstract void SuperOuterMethod();<br>
<br>
public class SuperInner<br>
{<br>
<br>
}<br>
}<br>
<br>
class SubOuter : SuperOuter<br>
{<br>
protected override void SuperOuterMethod()<br>
{<br>
System.Console.WriteLine("SubOuter Overrided method Called");<br>
}<br>
<br>
public class SubInner : SuperInner<br>
{<br>
public void SuperInnerMethodCaller(SuperOuter outer)<br>
{<br>
outer.SuperOuterMethod();<br>
}<br>
}<br>
}<br>
<br>
EndCode<br>
<br>
後者は僕的には動いてもいいのに、と思ったが危険な局面もあるのだろう。<br>
つまりこういうときは継承前にメソッドデリゲートの取得パスを入手しておくべきなのだ。<br>
継承元でかなり、みっちり設計する必要があるが。。<br>
次のコードが動作するので、こういう場合そうするべきだってことだ。<br>
<br>
<br>
class EntryPoint<br>
{<br>
public static void Main(string[] args)<br>
{<br>
SubOuter outer = new SubOuter();<br>
SubOuter.SubInner inner = new SubOuter.SubInner();<br>
inner.SuperInnerMethodCaller(outer);<br>
}<br>
}<br>
<br>
abstract class SuperOuter<br>
{<br>
protected abstract void SuperOuterMethod();<br>
<br>
public class SuperInner<br>
{<br>
protected void OuterMethodCaller(SuperOuter outer)<br>
{<br>
outer.SuperOuterMethod();<br>
}<br>
}<br>
}<br>
<br>
class SubOuter : SuperOuter<br>
{<br>
protected override void SuperOuterMethod()<br>
{<br>
System.Console.WriteLine("SubOuter Overrided method Called");<br>
}<br>
<br>
public class SubInner : SuperInner<br>
{<br>
public void SuperInnerMethodCaller(SuperOuter outer)<br>
{<br>
this.OuterMethodCaller(outer);<br>
}<br>
}<br>
}<br>
<br>
EndCode<br>
<br>
これは動く。<br>
つまり、継承しなければいいのだ。<br>
<br>
<br>
以上。<br>
<br>
PS:<br>
コーディングは適当にやったんで、かなりコンパイル時エラーがあると思う。<br>
ニュアンスが伝わればいいと思っているが、もしそういうものを見つけたら<br>
直しておいてくれるとうれしい。
表示オプション
横に並べて表示:
変化行の前後のみ表示: