Какова цель / использование абстрактных классов? (В поисках реальных примеров.) - PullRequest
3 голосов
/ 29 июня 2010

Может кто-нибудь показать мне пример абстрактного класса на Java? Что-то с реальным приложением (а не с образцом из учебника) было бы предпочтительнее.

Спасибо!

Ответы [ 5 ]

6 голосов
/ 29 июня 2010

Прочтите этот учебник по Абстрактные методы и классы .

Сначала вы объявляете абстрактный класс , GraphicObject, для предоставления переменных и методов-членов, которые совместно используются всеми подклассами , такими как текущая позиция и метод moveTo.GraphicObject также объявляет абстрактные методы для таких методов, как рисование или изменение размера, что должен быть реализован всеми подклассами , но должен быть реализован различными способами.Класс GraphicObject может выглядеть примерно так:

abstract class GraphicObject {
    int x, y;
    ...
    void moveTo(int newX, int newY) {
        ...
    }
    abstract void draw();
    abstract void resize();
}

Каждый неабстрактный подкласс GraphicObject, такой как Circle и Rectangle, должен обеспечивать реализации для методов рисования и изменения размера:

class Circle extends GraphicObject {
    void draw() {
        ...
    }
    void resize() {
        ...
    }
}
class Rectangle extends GraphicObject {
    void draw() {
        ...
    }
    void resize() {
        ...
    }
}
3 голосов
/ 29 июня 2010

Для примера из реального мира, почему бы не взглянуть на java.util.AbstractCollection?

2 голосов
/ 25 января 2011

В языке программирования Java abstract classes - это те, которые работают только как родительский класс или базовый класс.
Подклассы создаются для реализации методов, унаследованных от абстрактного класса (базового класса).Абстрактные классы не создаются напрямую.Сначала расширьте базовый класс, а затем создайте его экземпляр (создайте объекты).Абстрактные классы носят общий характер и реализуются для тех методов, которые обычно используются подклассами с общей реализацией.

например

abstract class A {
         public abstract abs_value();

         void show() 
                   {
                   System.out.println("This is an abstract class");
                   }
               }
2 голосов
/ 29 июня 2010

Для реального примера абстрактного класса давайте взглянем на AbstractTableModel.AbstractTableModel обеспечивает реализацию интерфейса TableModel (для использования с JTable).TableModel определяет следующие методы:

public boolean isCellEditable(int rowIndex, int columnIndex);
public Class<?> getColumnClass(int columnIndex);
public int getColumnCount();
public int getRowCount();
public Object getValueAt(int rowIndex, int columnIndex);
public String getColumnName(int columnIndex);
public void addTableModelListener(TableModelListener l);
public void removeTableModelListener(TableModelListener l);
public void setValueAt(Object aValue, int rowIndex, int columnIndex);

AbstractTableModel обеспечивает реализацию по умолчанию для всех, кроме трех из этих методов (getRowCount, getColumnCount и getValueAt), форсируя класс extingingобеспечить, по крайней мере, реализацию, чтобы определить размер и предоставить данные в таблицу.Он также обеспечивает хорошую обработку по умолчанию для слушателей, а также несколько удобных методов для запуска событий для этих слушателей.

1 голос
/ 29 июня 2010

Я думаю, что это общий пример из реальной жизни:

Это может быть немного дальше от того, что вы просили, но допустим, что мы используем среду ORM, такую ​​как Hibernate (не нужно действительно беспокоиться о том, что это такое или что это значит, просто знайте, что мы в основном собираемся вставить / обновление и извлечение объектов из базы данных).

Для каждой таблицы, в которую мы хотим вставить, у нас будет уникальный объект доступа к базе данных (DAO) для выполнения нашего набора требуемых операций с базой данных, но важно отметить, что все DAO будут выполнять некоторые аналогичные задачи, поэтому вот где абстрактные классы могут прийти нам на помощь. Мы можем объявить класс AbstractBaseDao, в котором изложены некоторые основные операции, которые могут нам понадобиться для всех наших DAO:

public class AbstractBaseDao {
    public void saveOrUpdate(Object o){
         //save or update object from database
    }

    public void loadAll(Class clazz){
        //Load all from database
    }

    public Object loadById(Class clazz, Long id){
       // Retrieve object by Id from database
    }

    // Additional common methods
}

Итак, еще раз, не очень важно, как эти методы реализованы для этого примера, просто поймите, что все DAO нуждаются в этих методах, и абстрактный класс дает нам повторное использование кода среди классов.

Теперь с нашим BaseDao мы можем создавать конкретные и специальные DAO для каждой таблицы, которые по-прежнему имеют желаемую общую функциональность:

public class PersonDao extends AbstractBaseDao{
     public List<People> listAllPersonsByLastName(String lastName){
         //Load people by last names from database
     }

     public List<People> listAllPersonsByBirthYear(Date date){
        //List people by birth year from database
     }
}

Теперь PersonDao может выполнять любые конкретные задачи, и мы не тратим время на переписывание кода, который мы уже написали. Хороший пример повторного использования кода.

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

...