今日のニワン語メモ

以前ニワン語で擬似オブジェクト指向、具体的にはクラス定義してインスタンス化する方法を書きましたが、その延長で継承について。
一応、継承も擬似的に行うことはできます。

0::/Person = Object.clone;
0::/Person.def(init(name, age), self.name = name; self.age = age; self.output = drawText(""));
0::/Person.def(aisatu(), output.text += name + ":" + age + "歳\n");
0::/Developer = Person.clone;
0::/Developer.def(work(), output.text += "プログラミング中・・・\n");
0::/d = Developer.clone;
0::/d.init("青野はるみ", 10);
0::/d.aisatu();
0::/d.work();

↓実行結果

青野はるみ:10歳
プログラミング中・・・

ただ、継承までするとなると欲しくなるのがメソッドのオーバーロード、オーバーライド、スーパークラスのメソッド呼び出しですが・・・。
結論から言うと、オーバーロードスーパークラスのメソッド呼び出しは不可ですがオーバーライドはできるようです。
それにまつわって、ニワン語のメソッド定義の仕様はこうなっているようです↓

  • 同名のメソッドが複数定義された場合、最後に定義されたもので上書きされる
  • メソッドの引数の違いは区別されない
0::/Person = Object.clone;
0::/Person.def(init(name, age), self.name = name; self.age = age; self.output = drawText(""));
0::/Person.def(aisatu(), output.text += name + ":" + age + "歳\n");
0::/Developer = Person.clone;
0::/Developer.def(aisatu(), output.text += name + ":" + age + "歳" + ":開発者\n");
0::/Developer.def(work(), output.text += "プログラミング中・・・\n");
0::/d = Developer.clone;
0::/d.init("青野はるみ", 10);
0::/d.aisatu();
0::/d.work();

↓実行結果

青野はるみ:10歳:開発者
プログラミング中・・・

別の例

0::/Person = Object.clone;
0::/Person.def(init(name, age), self.name = name; self.age = age; self.output = drawText(""));
0::/Person.def(init(), self.name = "無名"; self.age = 0; self.output = drawText(""));
0::/Person.def(aisatu(), output.text += name + ":" + age + "歳\n");
0::/p = Person.clone;
0::/p.init("青野はるみ", 10);
0::/p.aisatu();

↓実行結果

無名:0歳

んー、スーパークラスのメソッド呼び出しができないのは痛いですね・・・。これできないと擬似的にでも継承をしている意味が半減します。何か方法ないかな・・・。