OOP in Ada
やっぱりAdaでもOOPな感じに書きたい、ということで、ちょっと調べてみた。……これは単に「型互換性のある構造体」という認識で良いのだろうか。
with Ada.Strings.Unbounded;
package Actions is
package SU renames Ada.Strings.Unbounded;
type Action is tagged
record
Name : SU.Unbounded_String;
end record;
procedure New_Action (This : in out Action);
procedure Get_Name (This : in Action; Name : out String);
procedure Do_Action (This : in Action);
end Actions;
Java上がりのプログラマがまず面食らうのは、AdaのOOPにはドット記法が存在しないことだろう。上記のコードを見ると分かるが、Adaでは操作対象のインスタンスをプロシージャに引数として渡す――ただのプロシージャ呼び出しと全く分からない方法でコードを書いていくことになる
// in Java
Action act = new Action();
act.do_action();
-- in Ada
Act : Action;
New_Action (Act);
Do_Action (Act);
考え方としては、多態が可能なCの構造体(Adaでいうrecord
)なのだろう。Ada全体で見れば比較的統一的だし、なかなか良い方法なのかもしれない。
ちなみに、命名規則はクラス名が単数形、パッケージ名が複数形、がよく使われるらしい。