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

Абстрактный класс: пример речного времени

Недавно в интервью мне задали очень общий вопрос: "Что такое абстрактное в java". Я дал определение, и за ним последовал еще один вопрос об абстракции, как абстрактный метод и различие между абстрактным методом и конкретным методом и и т.п. Затем, наконец, интервьюер попросил дать пример в реальном времени, когда я должен использовать или определить класс как абстрактный. Я запутался. Я привел пример, но он не был убежден.

Я искал ее, но не нашел реального решения.

Так может ли кто-нибудь дать мне пример в реальном времени, т.е. когда он определил класс как абстрактный в своем проекте и почему?

Спасибо.

4b9b3361

Ответ 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);
  }
}

Здесь другой пример.