Fortran 2003 では、変数がスーパークラスで PRIVATE として宣言されている場合、サブクラスはそれにアクセスできません。しかし、すべての変数が PUBLIC として宣言されている場合、プログラムは「情報隠蔽」の性質を失います。
Fortran オブジェクト指向プログラミングで「データの継承」と「情報の隠蔽」の両方を取る方法はありますか? 2003 年でない場合、Fortran 2008 で何か改善点はありますか?
Fortran 2003 では、変数がスーパークラスで PRIVATE として宣言されている場合、サブクラスはそれにアクセスできません。しかし、すべての変数が PUBLIC として宣言されている場合、プログラムは「情報隠蔽」の性質を失います。
Fortran オブジェクト指向プログラミングで「データの継承」と「情報の隠蔽」の両方を取る方法はありますか? 2003 年でない場合、Fortran 2008 で何か改善点はありますか?
私の理解では、Fortran 2003 では、モジュールで定義された派生型のプライベート コンポーネントは、そのモジュール内で直接アクセスできます。1 つの意味 (私はテストしていません) は、これらのプライベート コンポーネントは、同じモジュールで定義されたサブタイプから直接アクセスできますが、別のモジュールで宣言されたサブタイプからはアクセスできないということです。私が言うように、私はこれをテストしておらず、修正する必要があります。
サブモジュールを実装するコンパイラがある場合、プライベート コンポーネントは子孫サブモジュールでも直接アクセスできます。サブモジュールは 2003 年の標準の発行後にテクニカル レポートで導入され、現在は 2008 の標準に含まれていると思いますが、広く使用されているコンパイラの多くはこの機能を実装していません。
標準にもかかわらず、スーパータイプのプライベート コンポーネントに直接アクセスできないことでどれだけの損失が発生するかは、私にはわかりません。オブジェクト指向の世界では、すべてのコンポーネントを非公開にし (他の言語ではアイデアを表現するために他の言葉を使用していますが)、アクセサー メソッドを介してのみアクセスを提供することが非常に一般的であるようです。プライベート コンポーネントの値を返すため。内部データ表現を外部アクセスから厳密に分離することにより、他のプロシージャがデータにアクセスする方法を変更せずに内部表現を変更することができ、この分離は一般に良い考えであると考えられています。
アクセサ プロシージャを使用すると、たとえば、派生型のインスタンスが構築されたときにコンポーネントの値を設定するプロシージャを提供するが、その値を変更するプロシージャを提供しないなど、アクセス制御のよりきめ細かい微妙な適用も可能になります。その後のコンポーネント。
パブリック アクセサー プロシージャを持つプライベート コンポーネントは、データの継承と情報の隠蔽の両方のほとんどを提供するように思えますが、質問に対する他の回答を読むことに興味があります。
残念ながら、Fortran では、派生型を拡張するタイプ バインド プロシージャからアクセスできる派生型のコンポーネントを定義する直接的な方法はありませんが、それ以外の場合は非表示になります。High Performance Mark が指摘したように、派生型コンポーネントへのアクセスはモジュールに基づいています。派生型のプライベート コンポーネントは、そのモジュール内からのみアクセスできます。
実用的な解決策は、これらのコンポーネントを派生型の拡張のみに使用するか、他の場所にも使用するかに関係なく、外部からアクセスできるすべての public を定義することです。この概念のプライベートとパブリックは、内部の詳細を変更できるか (プライベート)、変更できないか (パブリック) を決定するだけであり、コードの他の部分への影響を心配する必要はありません。
また、C++ のプロテクト メンバーのような言語機能を使用しても、基本的な問題は解決しないことに注意してください。プライベートではないものを宣言すると、その動作を変更すると、他のコードで副作用が発生します。 (たとえば、誰かが派生型を拡張し、拡張型からアクセスできる一部のメンバーの動作に依存している。)