Подтвердить что ты не робот

Почему вложенный абстрактный класс в java

Мне интересно, что значит иметь вложенный абстрактный класс? например,

   abstract class A{

          abstract class B{

          }
   }

Существуют ли какие-либо варианты использования или сценарий, которые могут потребоваться, например, дизайн? или есть что-то полезное в таком шаблоне? и почему Java позволяет нам это делать?

4b9b3361

Ответ 1

В дизайне вы хотите, чтобы базовый класс class A представлял только интерфейс для своих производных классов. Это означает, что вы не хотите, чтобы кто-либо фактически создавал экземпляр объекта базового класса. Вы только хотите поднять его (неявное повышение, которое дает вам полиморфное поведение), чтобы его интерфейс можно было использовать. Это достигается путем создания абстрактного класса с использованием абстрактного ключевого слова. В другой руке вы хотите использовать только часть функциональных возможностей class A, чтобы создать class B (как дочерний) значение уменьшить зависимости связи или реализации между системами и предотвратить дубликаты.

Но помните, когда вы определяете внутренний класс, код без внутренних классов более удобен и читабель. Когда вы получаете доступ к частным данным из внешнего класса, JDK-компилятор создает функции доступа к пакету доступа во внешнем классе, чтобы внутренний класс мог получить доступ к закрытым членам. Это оставляет дыру в безопасности. В общем, следует избегать использования внутренних классов. Использовать внутренний класс только в том случае, если внутренний класс применим только в контексте внешнего класса и/или внутреннего класса, он может быть закрытым, чтобы доступ к нему мог получить только внешний класс. Внутренние классы используются в основном для реализации вспомогательных классов, таких как Iterators, Comparators и т.д., которые используются в контексте внешнего класса. О abstract class он должен быть абстрактным для помощников, предположим, что ваши помощники должны быть слишком сложны, чтобы писать абстрактную форму для них.

В вашем случае я не помню широкого использования вложенных абстрактных классов, возможно, в мире Swing.

Ответ 2

абстрактные классы используются для обеспечения частичной реализации класса для наследования. он позволяет вам определить схему класса без предоставления полного определения, чтобы его можно было указывать в дочернем классе. он работает как интерфейс в том, что вы можете выполнять любую операцию, указанную в абстрактном классе, на экземпляр любых классов, полученных из него. Вложенные абстрактные классы предназначены для наследования другими внутренними классами (даже анонимными, я думаю), но не по классам, определенным за пределами внешнего класса.

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();
}