クラス

クラスは、そのクラスから作成されるオブジェクト インスタンスのデータ メンバーおよび関数メンバーを定義します。

マネージ COBOL では、各クラスがそれぞれ他の 1 つのクラスを継承します。継承元のクラスが (INHERITS 句で) 指定されていない場合は、System.Object (.NET) または java.lang.Object (JVM) を継承します。

コンテキスト:

プログラムの構造 タイプ

class-specification

class-header constraints-paragraph attribute-clause static-or-instance-field static-or-instance-member type-specification

class-header

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

class-id A.
01 sField string.
method-id doStuff.
   ...
end method.

class-id nestedClass.
...
end class.

end class.

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

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

ABSTRACT
基本クラスとしての使用のみを目的としたクラスを宣言します。抽象クラスは、不完全なクラスと考えられます。
FINAL
定義が完全なクラスを宣言します。クラスの FINAL 修飾子は、そのクラスを継承できないことを暗示します。
STATIC
インスタンス化できないクラスを宣言します。
PARTIAL
宣言が、宣言全体を構成する複数の部分のいずれかであることを示します。部分クラスを使用すると、クラス宣言を論理部分に分割できます。
INHERITS
クラスを継承することを定義します。type-specifier は、継承されるクラスを指定します。継承を使用すると、継承されるクラス タイプのメンバーを暗黙的にクラスに含めることができます。
IMPLEMENTS
インターフェイスを実装することを示します。type-specifier は、実装されるインターフェイスを指定します。
SERIALIZABLE
これにより、クラスのシリアル化を、System.Runtime.Serialization.Formatters.Binaryクラス経由で .NET COBOL で行うか、java.io.ObjectOutputStreamクラス経由で JVM COBOL で行うことができます。

抽象クラス

抽象クラス自体はインスタンス化できませんが、非抽象クラスで継承することによってインスタンス化できます。ABSTRACT クラスは継承する必要があるため、FINAL にすることはできません。

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

次の例に示すように、派生したクラスの非抽象メンバーに抽象クラスのメンバーを実装する場合は OVERRIDE を使用します。

       class-id. Animal abstract.
       method-id MakeNoise abstract. 
      *> No implementation allowed
       end method.

       end class.

       class-id Dog inherits type Animal.
      *> Overrides the MakeNoise method in the Animal class
       method-id MakeNoise override.
           display "Woof!"
       end method.
       end class.

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

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

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

最終クラス

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

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

ネストされたクラス

ネストされたクラスは、包含クラス内の静的フィールド、プロパティ、およびメソッドにアクセスできます。

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

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

SHARING PARENT 指定を持つネストされたクラス

SHARING PARENT 指定を持つネストされたクラスは、囲みクラスのインスタンス メソッド内からのみインスタンス化できます。これらのクラスは、そのインスタンス メンバーが private であっても、包含クラスからインスタンス メンバーにアクセスできます。

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

次に例を示します。

    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 companyName
    end method.
    end class.

    end class.

SHARING PARENT 指定を持たないネストされたクラス

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