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

Как абстрактный класс отличается от конкретного класса?

Я понимаю, ПОЧЕМ нам нужен абстрактный класс в Java - для создания подклассов. Но то же самое может быть достигнуто конкретным классом. например Класс Child распространяется родителем. Здесь Родитель вполне может быть абстрактным и конкретным. Так почему у нас АБСТРАКТ?

4b9b3361

Ответ 1

Абстрактные классы не могут быть созданы непосредственно. Объявление класса как абстрактного означает, что вы не хотите, чтобы он был создан, и что класс может быть унаследован. Вы вводите правило в свой код.

Если вы продлеваете пример отношений с родителями/дочерними элементами, чтобы включить класс Person, тогда было бы разумно, чтобы Person был абстрактным. Родитель - это конкретная идея, и это тоже ребенок. Человек является абстрактным понятием как в реальности, так и в коде.

Одно из преимуществ заключается в том, что вы явно определяете и защищаете идею абстрактного класса. Когда вы объявляете класс абстрактным, вы не можете использовать его неправильно, создавая экземпляр. Это рассуждение аналогично тому, как мы указываем функции и поля как публичные, частные или защищенные. Если вы объявляете функцию или член как приватную, вы фактически защищаете ее от неправильного доступа из кода клиента. Privates предназначены для использования в классе и для этого. Абстрактные классы должны быть унаследованы и что.

Теперь, вам нужно использовать абстрактные классы и определять функции и поля как частные, а не публичные? Нет, вы не. Но эти концепции предоставляются, чтобы помочь сохранить код чистым и хорошо организованным. С моей точки зрения, абстрактный класс реализуется на всех объектно-ориентированных языках. Если вы посмотрите вокруг, вы увидите, что С++, С#, VB.NET и т.д. Используют эту концепцию.

Лучший, конкретный пример:

Shape hierarchy UML Diagram

В приведенном выше примере класс Shape должен быть абстрактным, потому что он не полезен сам по себе.

Ответ 2

Абстрактный класс означает, что он абстрактный не завершен. Для его завершения нужен другой класс и/или его функциональность. Вы должны расширить абстрактный класс. Это будет полезно для определенного класса, например. Фрукты всех фруктов имеют такое же свойство, как цвет. Но у вас могут быть разные свойства для разных фруктов, таких как мякоть, например, апельсин или нет, например, Banana и т.д.

Ответ 3

Я знаю, что это старый вопрос, но похоже, что на плакате остались некоторые вопросы о пользе использования абстрактного класса.

Если вы единственный, кто когда-либо будет использовать ваш код, тогда на самом деле нет никакой пользы. Однако, если вы пишете код для других, то есть преимущество. Скажем, например, вы написали структуру кэширования, но хотите разрешить клиентам создавать свои собственные классы реализации кэширования. Вы также хотите отслеживать некоторые показатели, например, сколько кешей открыты, гипотетически. Ваш абстрактный класс может выглядеть примерно так:

public abstract class AbstractCache {
    public final void open() {
        ... // Do something here to log your metrics
        openImpl();
    }

    protected abstract void openImpl() { }
}

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

Ответ 4

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

Ответ 5

Абстрактный класс предназначен для использования в качестве базового класса, из которого производятся другие классы. Ожидается, что производный класс предоставит реализации для методов, которые не реализованы в базовом классе. Производный класс, реализующий все недостающие функции, называется конкретным классом

Ответ 6

Согласно моему пониманию

Абстрактный класс - это класс, который просто описывает поведение, но не реализует его. Рассмотрим этот пример Java для абстрактного класса:

public interface DoSomething(){
public void turnOnTheLight(); 
}

Конкретные классы - это те, которые должны быть реализованы. Например:

    public abstract class A(){
        public void doIt(); 
    } 
    public class B extends A(){
        public void doIt(){ 
        //concrete method
        System.out.println("I am a Concrete Class Test"); 
    }
 }

Другими словами, конкретный класс в java - это любой такой класс, который реализует все его унаследованные элементы либо из интерфейса, либо из абстрактного класса.