Абстрактные методы и классы: концепция позади?

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

Является ли главным преимуществом экономия времени, если объявить абстрактные методы в абстрактном суперклассе, которые не имеют тела метода, а затем переопределить их в своих подклассах?

4 ответа

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

Основным преимуществом является то, что вы не можете создать экземпляр абстрактного класса. Вы могли бы иметь класс Document как это:

public class Document {
    public void write(File file) {
        // I have no idea how to implement this
    }
    public void read(File file) {
        // I don't know here either
    }
}

Вы хотите, чтобы люди делали подклассы для своих типов документов:

public class MyDocument extends Document {
    public void write(File file) {
        // Now I know how to implement
    }
    public void read(File file) {
        // this also can be implemented
    }
}

Но вы не хотите, чтобы люди делали новые Documents:

Document doc = new Document(); // this should not be allowed

и вы хотите, чтобы люди делали что-то вроде этого:

Document doc = new MyDocument();

Решение состоит в том, чтобы сделать Document Аннотация:

public abstract class Document

и сделать методы тоже абстрактными:

public abstract void write(File file);
public abstract void read(File file);

Тогда вы не можете создать экземпляр Document но вы можете создавать экземпляры подклассов. Подклассы должны переопределять read а также write,

Вы делаете класс абстрактным, когда не хотите создавать его объект, и общие методы подклассов могут быть реализованы в абстрактном суперклассе, а другая цель состоит в том, чтобы сделать метод абстрактным, чтобы подкласс ДОЛЖЕН реализовывать суперкласс абстрактные методы для написания собственной реализации. Так просто.

Думайте об абстрактных классах как о способе создания контракта в API.

Предположим, вы создаете программу со списком товаров, которые продает магазин. Теперь этот список, конечно, будет содержать элементы, которые будут иметь определенные общие характеристики и определенные индивидуальные характеристики. Однако мы не можем продать "товар" - мы хотим продать "телевизор" или "стол".

Таким образом, вы должны создать абстрактный класс "Item", который имеет цену, дату изготовления и т. Д. Однако вы никогда не хотите, чтобы кто-либо создавал экземпляр класса Item, потому что элемент может быть чем угодно.

Вы хотите, чтобы программисты создавали подклассы и создавали свои собственные классы типа Item, которые полностью исполняют контракт, требуемый Item. В свою очередь, API позволяет добавлять классы, которые относятся к элементу подкласса, для помещения в список доступных элементов магазина. Это также автоматически предложит функциональность этим классам, о которой вам не нужно думать при создании подклассов, а также потребует от вас переопределить методы, которые вы ДОЛЖНЫ реализовать для этого класса.

В Java методы не должны быть абстрактными в абстрактном классе и могут быть реализованы так же, как в обычных классах. Например, если у вас есть тег orice, вы можете реализовать метод получения для этого ценника - нет необходимости заставлять подкласс реализовывать это.

Надеюсь, это имеет смысл. Еще не стесняйтесь комментировать, чтобы я мог уточнить.

Другие вопросы по тегам