Абстрактный класс: пример речного времени
Недавно в интервью мне задали очень общий вопрос: "Что такое абстрактное в java". Я дал определение, и за ним последовал еще один вопрос об абстракции, как абстрактный метод и различие между абстрактным методом и конкретным методом и и т.п.
Затем, наконец, интервьюер попросил дать пример в реальном времени, когда я должен использовать или определить класс как абстрактный. Я запутался. Я привел пример, но он не был убежден.
Я искал ее, но не нашел реального решения.
Так может ли кто-нибудь дать мне пример в реальном времени, т.е. когда он определил класс как абстрактный в своем проекте и почему?
Спасибо.
Ответы
Ответ 1
Хороший пример реального времени, найденный здесь: -
Конкретным примером абстрактного класса был бы класс, называемый Animal. Вы видите много животных в реальной жизни, но есть только виды животные. То есть, вы никогда не смотрите на что-то фиолетовое и пушистое и говорите "это животное, и нет более конкретного способа его определения". Вместо этого вы видите собаку или кошку или свинью... всех животных. Дело в том, что вы никогда не увидите, как животное идет вокруг, это не более в частности что-то другое (утка, свинья и т.д.). Животное - это абстрактный класс и Duck/Pig/Cat - все классы, которые вытекают из этого базовый класс. Животные могут обеспечить функцию "Возраст", которая добавляет 1 год жизни к животным. Он также может предоставить абстрактный метод называемый "IsDead", который при вызове скажет вам, есть ли у животного умер. Поскольку IsDead является абстрактным, каждое животное должно его реализовать. Итак, Кошка может решить, что она умерла после достижения 14-летнего возраста, но Утка может решить, что она умирает после 5 лет. Абстрактный класс Животное предоставляет функцию Возраста всем классам, которые происходят от него, но каждый из этих классов должен самостоятельно реализовать IsDead.
Бизнес example:
У меня есть механизм устойчивости, который будет работать против любых данных sourcer (XML, ASCII (с разделителями и фиксированной длиной), различные источники JDBC (Oracle, SQL, ODBC и т.д.) Я создал базовый, абстрактный класс для обеспечения общей функциональности в этом упорстве, но соответствующий "Порт" (подкласс) при сохранении моих объектов. (Это делает разработка новых "портов" намного проще, поскольку большая часть работы выполнена в суперклассах; особенно различные JDBC; так как я не только настойчивость, но другие вещи (например, генерация таблицы), у меня есть для обеспечения различных различий для каждой базы данных.) бизнес-примерами интерфейсов являются Коллекции. Я могу работать с java.util.List, не заботясь о том, как он реализован; имеющих Список поскольку абстрактный класс не имеет смысла, поскольку существуют фундаментальные различия в том, как работает aArrayList, а не LinkedList. Аналогично, карта и набор. И если я просто работаю с группой объектов и не волнует, если это список, карта или набор, я могу просто использовать Интерфейс коллекции.
Ответ 2
Вот что-то об абстрактном классе...
- Абстрактный класс является неполным классом, поэтому мы не можем его создать.
- Если методы абстрактны, класс должен быть абстрактным.
- В абстрактном классе мы используем абстрактный и конкретный метод.
- Нельзя определить абстрактный класс и окончательный оба.
Пример в реальном времени -
Если вы хотите сделать новый автомобиль (WagonX), в который включены все другие свойства автомобиля, такие как цвет, размер, двигатель и т.д., и вы хотите добавить еще несколько функций, таких как model, baseEngine в свой автомобиль. Затем просто вы создать абстрактный класс WagonX, где вы используете все предопределенные функции как абстрактные, а другие функциональные возможности являются конкретными, что определено вами.
Другой подкласс, который расширяет абстрактный класс WagonX, по умолчанию также получает доступ к абстрактным методам, которые создаются в абстрактном классе. SubClasses также обращаются к конкретным методам, создавая объект подкласса.
Для повторного использования кода разработчики в основном используют абстрактный класс.
abstract class WagonX
{
public abstract void model();
public abstract void color();
public static void baseEngine()
{
// your logic here
}
public static void size()
{
// logic here
}
}
class Car extends WagonX
{
public void model()
{
// logic here
}
public void color()
{
// logic here
}
}
Ответ 3
Вы должны иметь возможность процитировать хотя бы один из самого JDK. Посмотрите в пакете java.util.collections
. Существует несколько абстрактных классов. Вы должны полностью понять интерфейс, абстрактную и конкретную для Map
и почему Джошуа Блох написал это так.
Ответ 4
Лучший пример абстрактного класса - GenericServlet
. GenericServlet
является родительским классом HttpServlet
. Это абстрактный класс.
При наследовании "GenericServlet" в пользовательском классе сервлета метод service()
должен быть переопределен.
Ответ 5
Я часто использую абстрактные классы в сочетании с Шаблон метода шаблона.
В основном абстрактном классе я написал скелет основного алгоритма и сделаю абстрактные методы как крючки, где suclasses могут выполнить конкретную реализацию; Я часто использовал при написании анализатора данных (или процессора), которые нуждаются в чтении данных из одного места (файла, базы данных или некоторых других источников), имеют аналогичный шаг обработки (возможно, небольшие различия) и разные выходные данные.
Этот шаблон выглядит как шаблон стратегии, но он дает вам меньшую детализацию и может быть деградирован до сложного mantainable кода, если основной код слишком сильно растет или слишком исключены из основного (эти соображения исходили из моего опыта).
Небольшой пример:
abstract class MainProcess {
public static class Metrics {
int skipped;
int processed;
int stored;
int error;
}
private Metrics metrics;
protected abstract Iterator<Item> readObjectsFromSource();
protected abstract boolean storeItem(Item item);
protected Item processItem(Item item) {
/* do something on item and return it to store, or null to skip */
return item;
}
public Metrics getMetrics() {
return metrics;
}
/* Main method */
final public void process() {
this.metrics = new Metrics();
Iterator<Item> items = readObjectsFromSource();
for(Item item : items) {
metrics.processed++;
item = processItem(item);
if(null != item) {
if(storeItem(item))
metrics.stored++;
else
metrics.error++;
}
else {
metrics.skipped++;
}
}
}
}
class ProcessFromDatabase extends MainProcess {
ProcessFromDatabase(String query) {
this.query = query;
}
protected Iterator<Item> readObjectsFromSource() {
return sessionFactory.getCurrentSession().query(query).list();
}
protected boolean storeItem(Item item) {
return sessionFactory.getCurrentSession().saveOrUpdate(item);
}
}
Здесь другой пример.