Rexx-オブジェクト指向
環境の章に従ってooRexxをインストールすると、クラスとオブジェクトを操作することもできます。以下のコードはすべて、ooRexxインタープリターで実行する必要があることに注意してください。通常のRexxインタープリターは、このオブジェクト指向コードを実行できません。
クラスとメソッドの宣言
クラスは、次の構文宣言で定義されます。
構文
::class classname
どこ classname クラスに付けられた名前です。
クラス内のメソッドは、次の構文宣言で定義されます。
構文
::method methodname
どこ methodname メソッドに付けられた名前です。
クラスのプロパティは、以下の構文宣言で定義されます。
構文
::attribute propertyname
どこ propertyname プロパティに付けられた名前です。
例
以下は、Rexxのクラスの例です。
::class student
::attribute StudentID
::attribute StudentName
上記のプログラムについては、以下の点に注意する必要があります。
- クラスの名前は学生です。
- このクラスには、StudentIDとStudentNameの2つのプロパティがあります。
ゲッターとセッターのメソッド
GetterメソッドとSetterメソッドは、プロパティの値を自動的に設定および取得するために使用されます。Rexxでは、attributeキーワードを使用してプロパティを宣言すると、getterメソッドとsetterメソッドがすでに配置されています。
例
::class student
::attribute StudentID
::attribute StudentName
上記の例では、StudentIdとStudentNameのGetterメソッドとSetterメソッドがあります。
それらの使用方法の例を次のプログラムに示します。
/* Main program */
value = .student~new
value~StudentID = 1
value~StudentName = 'Joe'
say value~StudentID
say value~StudentName
exit 0
::class student
::attribute StudentID
::attribute StudentName
上記のプログラムの出力は以下のようになります。
1
Joe
インスタンスメソッド
オブジェクトは、クラスから作成できます。 ~new operator。クラスのメソッドは、次の方法で呼び出すことができます。
Object~methodname
どこ methodname クラスから呼び出す必要のあるメソッドです。
例
次の例は、クラスからオブジェクトを作成し、それぞれのメソッドを呼び出す方法を示しています。
/* Main program */
value = .student~new
value~StudentID = 1
value~StudentName = 'Joe'
value~Marks1 = 10
value~Marks2 = 20
value~Marks3 = 30
total = value~Total(value~Marks1,value~Marks2,value~Marks3)
say total
exit 0
::class student
::attribute StudentID
::attribute StudentName
::attribute Marks1
::attribute Marks2
::attribute Marks3
::method 'Total'
use arg a,b,c
return (ABS(a) + ABS(b) + ABS(c))
上記のプログラムの出力は以下のようになります。
60
複数のオブジェクトの作成
クラスの複数のオブジェクトを作成することもできます。次の例は、これを実現する方法を示しています。
ここでは、3つのオブジェクト(st、st1、st2)を作成し、それに応じてそれらのインスタンスメンバーとインスタンスメソッドを呼び出しています。
複数のオブジェクトを作成する方法の例を見てみましょう。
例
/* Main program */
st = .student~new
st~StudentID = 1
st~StudentName = 'Joe'
st~Marks1 = 10
st~Marks2 = 20
st~Marks3 = 30
total = st~Total(st~Marks1,st~Marks2,st~Marks3)
say total
st1 = .student~new
st1~StudentID = 2
st1~StudentName = 'John'
st1~Marks1 = 10
st1~Marks2 = 20
st1~Marks3 = 40
total = st1~Total(st1~Marks1,st1~Marks2,st1~Marks3)
say total
st2 = .student~new
st2~StudentID = 3
st2~StudentName = 'Mark'
st2~Marks1 = 10
st2~Marks2 = 20
st2~Marks3 = 30
total = st2~Total(st2~Marks1,st2~Marks2,st2~Marks3)
say total
exit 0
::class student
::attribute StudentID
::attribute StudentName
::attribute Marks1
::attribute Marks2
::attribute Marks3
::method 'Total'
use arg a,b,c
return (ABS(a) + ABS(b) + ABS(c))
上記のプログラムの出力は以下のようになります。
60
70
60
継承
継承は、あるクラスが別のクラスのプロパティ(メソッドとフィールド)を取得するプロセスとして定義できます。継承を使用すると、情報が階層順に管理できるようになります。
他のプロパティを継承するクラスは、 subclass (派生クラス、子クラス)およびプロパティが継承されるクラスは次のように知られています。 superclass (基本クラス、親クラス)。
Rexxでの継承の例を見てみましょう。次の例では、というクラスを作成しています。Person。そこから、サブクラスキーワードを使用してStudent class として sub-class of Person。
例
/* Main program */
st = .student~new
st~StudentID = 1
st~StudentName = 'Joe'
st~Marks1 = 10
st~Marks2 = 20
st~Marks3 = 30
say st~Total(st~Marks1,st~Marks2,st~Marks3)
exit 0
::class Person
::class student subclass Person
::attribute StudentID
::attribute StudentName
::attribute Marks1
::attribute Marks2
::attribute Marks3
::method 'Total'
use arg a,b,c
return (ABS(a) + ABS(b) + ABS(c))
上記のプログラムの出力は以下のようになります。
60