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