[前へ] [目次へ] [次へ]

メソッド呼び出しの解決規則


FGESでの様々な条件でのメソッド解決規則のサンプルです。

基本規則
●言語定義メソッドは継承されない
●演算子メソッドは常にオブジェクトの型のものを使用する
●アップキャストしていてもオーバーライドしたメソッドが使用される
●動的解決した場合は常にオブジェクトの型のものを使用する
●インターフェイスメソッドは参照の型が当該インターフェイスの場合のみ使用される

様々な呼び出しのサンプル(コンソール版FGESで実行できます)
<  1>
<  2>
<  3>
<  4>
<  5>
<  6>
<  7>
<  8>
<  9>
< 10>
< 11>
< 12>
< 13>
< 14>
< 15>
< 16>
< 17>
< 18>
< 19>
< 20>
< 21>
< 22>
< 23>
< 24>
< 25>
< 26>
< 27>
< 28>
< 29>
< 30>
< 31>
< 32>
< 33>
< 34>
< 35>
< 36>
< 37>
< 38>
< 39>
< 40>
< 41>
< 42>
< 43>
< 44>
< 45>
< 46>
< 47>
< 48>
< 49>
< 50>
< 51>
< 52>
< 53>
< 54>
< 55>
< 56>
< 57>
< 58>
< 59>
< 60>
< 61>
< 62>
< 63>
< 64>
< 65>
< 66>
< 67>
< 68>
< 69>
< 70>
< 71>
< 72>
< 73>
< 74>
< 75>
< 76>
< 77>
< 78>
< 79>
< 80>
< 81>
< 82>
< 83>
< 84>
< 85>
< 86>
< 87>
< 88>
< 89>
< 90>
< 91>
< 92>
< 93>
< 94>
< 95>
< 96>
< 97>
< 98>
< 99>
<100>
<101>
<102>
<103>
<104>
<105>
<106>
<107>
<108>
<109>
<110>
<111>
<112>
<113>
<114>
<115>
<116>
<117>
<118>
<119>
<120>
<121>
<122>
<123>
<124>
<125>
<126>
<127>
<128>
<129>
<130>
<131>
<132>
<133>
<134>
<135>
<136>
<137>
<138>
<139>
<140>
<141>
<142>
<143>
<144>
<145>
<146>
<147>
<148>
<149>
<150>
<151>
<152>
<153>
<154>
<155>
<156>
<157>
<158>
<159>
<160>
<161>
<162>
<163>
<164>
<165>
<166>
<167>
<168>
   interface I1{
      
method void if_method();
   }
   
class C1:values IInteger implements I1{
      
method #Init(){puts("C1::#Init");}
      
method #Clear(){puts("C1::#Clear");}
      
method #Value(IInteger v){puts("C1::#Value");}
      
method SelfType#operator+(IInteger v){puts("C1::#operator+");retref this;}
      
method static void static_method(){puts("C1::static_method");}
      
method final void final_method(){puts("C1::final_method");}
      
method void normal_method(){puts("C1::normal_method");}
      
method void I1@@if_method(){puts("C1::if_method");}
   }
   
class C2:extends C1 values IInteger{
      
method #Init(){puts("C2::#Init");}
      
method #Clear(){puts("C2::#Clear");}
      
method #Value(IInteger v){puts("C2::#Value");}
      
method SelfType#operator+(IInteger v){puts("C2::#operator+");retref this;}
      
method forced_override void static_method(){puts("C2::static_method");}
      
method forced_override void final_method(){puts("C2::final_method");}
      
method override void normal_method(){puts("C2::normal_method");}
   }
   
class C3:extends C2 implements I1{
      
method #Init(){puts("C3::#Init");}
      
method #Clear(){puts("C3::#Clear");}
      
method #Value(IInteger v){puts("C3::#Value");}
      
method SelfType#operator+(IInteger v){puts("C3::#operator+");retref this;}
      
method forced_override void static_method(){puts("C3::static_method");}
      
method forced_override void final_method(){puts("C3::final_method");}
      
method override void normal_method(){puts("C3::normal_method");}
      
method void I1@@if_method(){puts("C3::if_method");}
   }
   
class C4:wraps C1{
      
method #Init(){puts("C4::#Init");}
      
method #Clear(){puts("C4::#Clear");}
   }
   
class C5:wraps C4 implements I1{
      
method #Init(){puts("C5::#Init");}
      
method #Clear(){puts("C5::#Clear");}
      
method SelfType#operator+(IInteger v){puts("C5::#operator+");retref this;}
      
method static void static_method(){puts("C5::static_method");}
      
method final void final_method(){puts("C5::final_method");}
      
method void normal_method(){puts("C5::normal_method");}
      
method void I1@@if_method(){puts("C5::if_method");}
   }
   
class C6:wraps C3{
      
method #Init(){puts("C6::#Init");}
      
method #Clear(){puts("C6::#Clear");}
   }
   
method void values_method1(values C1 v){puts("values_method1");}
   
method void values_method2(values C2 v){puts("values_method2");}
   
   
method void main(){
      I1* i1;
      puts(
"C1");
      C1 c1;
      C1* p1;
      c1+0;
      c1.static_method();
      c1.final_method();
      c1.normal_method();
      p1#=c1;
      *p1+0;
      p1->static_method();
      p1->final_method();
      p1->normal_method();
      p1->$static_method();
      p1->$final_method();
      p1->$normal_method();
      i1#=c1;
      i1->if_method();
      i1->$normal_method();
      puts(
"C2");
      C2 c2;
      C2* p2;
      c2+0;
      c2.static_method();
      c2.final_method();
      c2.normal_method();
      p1#=c2;
      *p1+0;
      p1->static_method();
      p1->final_method();
      p1->normal_method();
      p1->$static_method();
      p1->$final_method();
      p1->$normal_method();
      p2#=c2;
      *p2+0;
      p2->static_method();
      p2->final_method();
      p2->normal_method();
      p2->$static_method();
      p2->$final_method();
      p2->$normal_method();
      i1#=c2;
      i1->if_method();
      i1->$normal_method();
      puts(
"C3");
      C3 c3;
      C3* p3;
      c3+0;
      c3.static_method();
      c3.final_method();
      c3.normal_method();
      p1#=c3;
      *p1+0;
      p1->static_method();
      p1->final_method();
      p1->normal_method();
      p1->$static_method();
      p1->$final_method();
      p1->$normal_method();
      p2#=c3;
      *p2+0;
      p2->static_method();
      p2->final_method();
      p2->normal_method();
      p2->$static_method();
      p2->$final_method();
      p2->$normal_method();
      p3#=c3;
      *p3+0;
      p3->static_method();
      p3->final_method();
      p3->normal_method();
      p3->$static_method();
      p3->$final_method();
      p3->$normal_method();
      i1#=c3;
      i1->if_method();
      i1->$normal_method();
      puts(
"C4");
      C4 c4;
      
//c4+0;//これはできない
      
c4.static_method();
      c4.final_method();
      c4.normal_method();
      i1#=c4;
      i1->if_method();
      i1->$normal_method();
      puts((*i1#==c4).to_s());
      puts(
"C5");
      C5 c5;
      c5+0;
      c5.static_method();
      c5.final_method();
      c5.normal_method();
      i1#=c5;
      i1->if_method();
      i1->$normal_method();
      puts((*i1#==c5).to_s());
      puts(
"C6");
      C6 c6;
      
//c6+0;//これはできない
      
c6.static_method();
      c6.final_method();
      c6.normal_method();
      i1#=c6;
      i1->if_method();
      i1->$normal_method();
      puts((*i1#==c6).to_s());
      puts(
"values1");
      values_method1(0);
      puts(
"values2");
      values_method2(0);
      puts(
"end");
   } 

実行結果:
C1
C1::#Init
C1::#operator+
C1::static_method
C1::final_method
C1::normal_method
C1::#operator+
C1::static_method
C1::final_method
C1::normal_method
C1::static_method
C1::final_method
C1::normal_method
C1::if_method
C1::normal_method
C2
C1::#Init
C2::#Init
C2::#operator+
C2::static_method
C2::final_method
C2::normal_method
C2::#operator+
C1::static_method
C1::final_method
C2::normal_method
C2::static_method
C2::final_method
C2::normal_method
C2::#operator+
C2::static_method
C2::final_method
C2::normal_method
C2::static_method
C2::final_method
C2::normal_method
C1::if_method
C2::normal_method
C3
C1::#Init
C2::#Init
C3::#Init
C3::#operator+
C3::static_method
C3::final_method
C3::normal_method
C3::#operator+
C1::static_method
C1::final_method
C3::normal_method
C3::static_method
C3::final_method
C3::normal_method
C3::#operator+
C2::static_method
C2::final_method
C3::normal_method
C3::static_method
C3::final_method
C3::normal_method
C3::#operator+
C3::static_method
C3::final_method
C3::normal_method
C3::static_method
C3::final_method
C3::normal_method
C3::if_method
C3::normal_method
C4
C1::#Init
C4::#Init
C1::static_method
C1::final_method
C1::normal_method
C1::if_method
C1::normal_method
true
C5
C1::#Init
C4::#Init
C5::#Init
C5::#operator+
C5::static_method
C5::final_method
C5::normal_method
C5::if_method
C5::normal_method
true
C6
C1::#Init
C2::#Init
C3::#Init
C6::#Init
C3::static_method
C3::final_method
C3::normal_method
C3::if_method
C3::normal_method
true
values1
C1::#Init
C1::#Value
values_method1
C1::#Clear
values2
C1::#Init
C2::#Init
C2::#Value
values_method2
C2::#Clear
C1::#Clear
end
C6::#Clear
C3::#Clear
C2::#Clear
C1::#Clear
C5::#Clear
C4::#Clear
C1::#Clear
C4::#Clear
C1::#Clear
C3::#Clear
C2::#Clear
C1::#Clear
C2::#Clear
C1::#Clear
C1::#Clear


[前へ] [目次へ] [次へ]

最終更新 2017/04/16