クラス

クラスは、そのクラスから作成されるオブジェクト・インスタンスのデータ・メンバと関数メンバを定義します。マネージ COBOL により、クラスは 1 つ以上の他のクラスから継承できます。

コンテキスト:

    プログラムの構造
        タイプ

class-specification

class-header constraints-paragraph constraints-paragraph static-or-instance-member type-specification

class-header

access-modifier type-specifier type-specifier attribute-clause generic-using-phrase

class A.
01 sField string.
Method doStuff.
   ...
end method.

class nestedClass.
...
end class.

end class.

コアのサンプルも参照してください。このサンプルは、[スタート > すべてのプログラム > Micro Focus Enterprise Developer > Samples] の COBOL for JVM の下にあります。

クラス・ヘッダのキーワード

ABSTRACT
基本クラスとしてのみ使用される予定のクラスを宣言します。抽象クラスは、不完全なクラスと考えられます。不完全なクラスがそのメンバにアクセスするには継承される必要があります。
FINAL
定義が完全なクラスを宣言します。クラスの FINAL 変更子は、クラスでサブクラスを使用できないことを暗示します。
STATIC
インスタンス化できないクラスを宣言します。
PARTIAL
宣言が、宣言全体を構成する 2 つ以上の部分のいずれかであることを示します。部分クラスを使用すると、クラス宣言を論理部分に分割することができます。
INHERITS
クラスが継承されることを定義します。type-specifier は、継承されるクラスを指定します。継承を使用すると、クラスに、継承されるクラス・タイプのメンバを暗黙的に含めることができます。
IMPLEMENTS
インターフェースが実装されることを示します。type-specifier は、実装されるインターフェースを指定します。

抽象クラス

抽象クラスは、インスタンス化できないクラスですが、継承のみは可能です。このため、抽象クラスは、通常基本クラスとして使用されます。抽象クラスのメンバは、抽象クラスでのみ宣言され、実装はできません。抽象クラスは継承される必要があるため、抽象クラスの宣言時に FINAL 変更子は使用できません。

抽象クラスには、通常抽象メソッドが含まれます。このメソッドは、インターフェースのメソッド宣言と同様に、クラス宣言では実装できません。抽象クラスはインスタンス化できないため、抽象クラスを継承するサブクラスでは、抽象クラスで定義される抽象メソッドの実装を提供する必要があります。抽象メソッドを含めることができるのは、抽象クラスのみです。

抽象クラスは、クラスからオブジェクトを作成しない場合に役立ちます。サブクラスを使用して実装を完了する際に、クラスを抽象として宣言します。

非抽象クラスがインターフェースを介して抽象クラスから派生する場合、継承されたクラスは、抽象クラスのすべての抽象メンバを実装する必要があります。次の例に示すように、派生したクラスの非抽象メンバに抽象クラスのメンバを実装する場合、OVERRIDE を使用します。

       class-id. Animal abstract.
       method-id MakeNoise abstract. 
      *> 実装は許可されない
       end method.

       end class.

       class-id Dog inherits type Animal.
      *> Animal クラスの MakeNoise メソッドをオーバーライドする
       method-id MakeNoise override.
           display "Woof!"
       end method.
       end class.

この例では、抽象クラス Animal には、抽象メソッド MakeNoise が含まれます。非抽象クラス Dog は抽象クラス Animal から継承するため、OVERRIDE 変更子を使用して MakeNoise の実装を提供する必要があります。

抽象クラスには、抽象メソッドに加えて非抽象メソッドも含めることができます。

抽象クラスを継承するクラスは、継承されたクラスのメンバの実装を提供しない場合、抽象クラスとしても宣言される必要があります。

最終クラス

最終クラスは継承できません。このため、最終クラスのメソッドはオーバーライドできません。

クラスを FINAL で宣言すると、クラスの破損防止に役立ちます。また、サブクラスが目的の動作をオーバーライドすることで目的のクラスの機能を変更してしまう危険を防ぎます。

ネストされたクラス

ネストされたクラスは、次の構文を使用して、包含クラス内の静的フィールド、プロパティ、メソッドにアクセスできます。

self::memberName

ネストされたクラス定義のオプションの句 SHARING PARENT を使用すると、ネストされたクラスは、包含クラスのインスタンス・フィールド、プロパティ、メソッドにアクセスできます。

    class-id ContainingClass. 
    ...
    class-id Nested1. 
        ... 
    end class.
    class-id Nested2 sharing parent. 
       ... 
    end class. 
    end class.

SHARING PARENT を使用するネストされたクラス

SHARING PARENT 句を使用するネストされたクラスは、囲みクラスのインスタンス・メソッド内からのみインスタンス化できます。これらのクラスは、そのインスタンス・メンバが private であっても、self:: 構文を使用して包含クラスからインスタンス・メンバにアクセスできます。

このようなネストされたクラスには、その包含クラスのインスタンスへの暗黙参照が含まれます。ネストされたクラスでは、この参照を使用して、囲みクラスのインタンス・メンバにアクセスします。つまり、外部で保持される内部クラスへのすべての参照のガベージが収集されるまで、包含クラス・インスタンスのガベージは収集されません。

次に例を示します。

    class-id ContainingClass. 
    01 companyName string value "Micro Focus".
    
    method-id instance1.
    01 o type Nested2.
        set o to new Nested2
        ...
    end method

    class-id Nested2 SHARING PARENT. 
    method-id method2
        display self::companyName
    end method.
    end class.

    end class.

SHARING PARENT を使用しないネストされたクラス

SHARING PARENT 句を使用せずに定義されるネストされたクラスは、public、private または internal として宣言できます。指定された可視性に応じて、これらのクラスは、包含クラスやインスタンス・メソッドからではなく、コンテキストからインスタンス化できます。また、self:: 構文を使用して包含クラスのインスタンス・メンバにアクセスできません。ただし、明示的なオブジェクト参照を使用する場合のみアクセスできます。