2

この質問にタグを付け直して、関連する言語を含めてください

したがって、私のJavaの本には、ネストされたクラスに関する章全体がありましたが、「構成関係のモデル化と非表示にしたいクラスの内部の実装」に関してのみ、それらを実際に使用する必要があることに注意して終了しました。それでは、ネストされたクラスといくつかの例をいつ使用するかについて説明しましょう。

4

3 に答える 3

3

ネストされた/内部クラスは、独自のクラスファイルを持たない別のクラスのコンテキストでのみ使用されるクラスです。インスタンスにリンクされている場合は、親クラスインスタンスのコンテキストでのみインスタンス化できます。プライベートデータを表示することも、静的クラスの場合はプライベート静的データのみを表示することもできます。

Java開発者サイトには、1つの例を含むネストされたクラスのチュートリアルがあります:http: //java.sun.com/docs/books/tutorial/java/javaOO/nested.html

使用例:

  • インターフェイスの具体的な実装を非表示にします。

(Hibernateのようなツールのデータベースセッションを考えます):Sessionインターフェイスと、Sessionのインスタンスを返すSessionFactoryがあるとします。Sessionインターフェースを実装するSessionImpl具象クラスは、それを構築および初期化する方法を知っているファクトリの内部クラスである可能性があります。

  • インターフェイスを実装して情報を提供します。

Wicket Webフレームワークでは、各GUIコンポーネントに「モデル」が関連付けられており、その役割はデータをコンポーネントに接続することです。インターフェイスは次のようになります。

public interface IModel extends IDetachable {
 public Object getObject();
 public Object setObject();
}

作成したカスタムGUIコンポーネントのデータを取得するための特別なロジックがあるとします。他のコンポーネントが同じ方法でデータを取得することはないため、IModelが提供された時点で匿名クラスを使用して、データの取得を処理できます。同じクラスにIModel実装を再利用する必要がある別のポイントがある場合は、それを内部クラスにすることができます。後で、他の場所でモデルが必要になった場合は、それをトップレベルのクラスに変換できます。

通常、クラス定義が必要な状況で内部クラスを使用しますが、そのクラスは使用可能であるか、親クラスのコンテキストでのみ意味があります。

于 2009-10-11T01:20:14.380 に答える
3

ネストされたクラスで実際に使用したのは、グローバル設定オブジェクトでした。

親クラスは、ネストされたクラスを設定カテゴリとして持つシングルトンでした。

  • 設定
    • ファイル設定
    • 印刷設定
    • 等。

内部オブジェクトを個別のクラスとして作成しても、設定クラスのスコープ外では使用できないため、実際には意味がありませんでした。

于 2009-10-11T00:45:08.283 に答える
2

通常は多くの引数を持つメソッドとして実行されるアルゴリズムをカプセル化するために、ネストされたクラスを使用します。生データを持つクラスを使用し、ネストされたクラスの別のファイルにアルゴリズムを入れます (部分キーワードを使用)。そうすれば、そのアルゴリズムのプロパティを配置でき、その (作業中の) データは、アルゴリズムが完了した後に有効になります。ネストされたクラスがなくても簡単に実行できることはわかっていますが、親クラス用にアルゴリズムが意図的に構築されているため、これは正しいと感じています。

   public partial class Network
    {
            partial void initFDLF()
            {
                fdlf=new FDLF(this);
            }

        public FDLF fdlf;
        public class FDLF
        {
            internal bool changed=true;
            internal bool pvchange=true;
            public double epsilon = 0.001;
            public bool fdlfOk=false;
            public void init(){...}
            public void run(){...}
            ...
于 2009-10-11T09:48:51.400 に答える