Абстрактные методы и классы: концепция позади?
В чем именно заключается вся концепция наличия абстрактного класса (в моем случае я имею в виду 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
}
}
Но вы не хотите, чтобы люди делали новые Document
s:
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, вы можете реализовать метод получения для этого ценника - нет необходимости заставлять подкласс реализовывать это.
Надеюсь, это имеет смысл. Еще не стесняйтесь комментировать, чтобы я мог уточнить.