19

ネストされた抽象クラスを持つとはどういう意味ですか? 例えば、

   abstract class A{

          abstract class B{

          }
   }

設計など、必要になるユースケースやシナリオはありますか? または、そのようなパターンで役立つものはありますか? なぜ Java でそれができるのでしょうか?

4

2 に答える 2

6

設計では、基本クラスclass Aがその派生クラスのインターフェイスのみを提示するようにします。これは、基本クラスのオブジェクトを実際にインスタンス化することを誰も望んでいないことを意味します。そのインターフェースを使用できるように、それにアップキャストするだけです(暗黙のアップキャスト、ポリモーフィックな動作を提供します。これは、abstract キーワードを使用してそのクラスを抽象化することによって実現されます。一方、の機能の一部のみを使用する場合は、(子として) class A作成して、システム間の結合または実装の依存関係を減らし、重複を防ぎます。class B

ただし、内部クラスを定義するときは、内部クラスのないコードの方が保守しやすく、読みやすいことに注意してください。外側のクラスのプライベート データ メンバーにアクセスすると、JDK コンパイラは、内側のクラスがプライベート メンバーにアクセスするためのパッケージ アクセス メンバー関数を外側のクラスに作成します。これにより、セキュリティ ホールが残ります。一般に、内部クラスの使用は避けるべきです。内部クラスが外部クラスのコンテキストでのみ関連する場合、および/または外部クラスのみがアクセスできるように内部クラスを非公開にできる場合にのみ、内部クラスを使用します。内部クラスは主に、外部クラスのコンテキストで使用される Iterators、Comparators などのヘルパー クラスを実装するために使用されます。についてabstract class、それはヘルパーにとって抽象的であるべきです、あなたのヘルパーを仮定してください複雑すぎて抽象的な形式を書くことができません。

あなたの場合、おそらくSwing世界で、ネストされた抽象クラスを広範囲に使用したことを覚えていません。

于 2012-11-18T06:20:30.083 に答える
4

抽象クラスは、継承用のクラスの部分的な実装を提供するために使用されます。完全な定義を提供せずにクラスのスキームを定義できるため、子クラスで指定できます。抽象クラスから派生した任意のクラスのインスタンスに対して、抽象クラスで指定された任意の操作を実行できるという点で、インターフェイスのように機能します。ネストされた抽象化されたクラスは、他の内部クラス (私が思うに匿名のものも含む) によって継承されるように設計されていますが、最も外側のクラスの外側で定義されたクラスによっては継承されません。

public class HelloEveryone{
    abstract class Hello{
        void SayHello(){
            System.out.println("Hello!");
        }

        abstract void SayHelloAlt();
    }

    public class HelloWorld extends Hello{
        public void SayHelloAlt(){
            System.out.println("HelloWorld!");
        } 
    }

    public class HelloUniverse extends Hello{
        public void SayHelloAlt(){
            System.out.println("HelloUniverse!");
        } 
    }

    void Go(){
        ArrayList<Hello> hellos = new ArrayList<Hello>();
        hellos.add(new HelloWorld());
        hellos.add(new HelloUniverse());


        for (Hello h : hellos){
            h.SayHello();
            h.SayHelloAlt();
        }
    }   

}

static void main(){
    HelloEveryone hello = new HelloEveryone();
    hello.Go();
}
于 2012-11-18T06:27:01.770 に答える