抽象类的目的/用途是什么? (寻找现实世界的例子。)

时间:2010-06-29 03:50:03

标签: java inheritance oop abstract-class

有人可以给我看一下Java中抽象类的例子吗?具有真实世界应用程序(而不是教科书样本)的东西将是更可取的。

谢谢!

5 个答案:

答案 0 :(得分:6)

Abstract Methods and Classes上阅读本教程。

  

首先,您声明一个抽象类,   GraphicObject,提供成员   完全变量和方法   所有子类共享,例如   当前的位置和举动   方法。 GraphicObject也声明了   方法的抽象方法,例如   绘制或调整大小,需要   由所有子类实现但必须   以不同的方式实施。该   GraphicObject类可以看起来像什么   像这样:

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

每个非抽象的子类   GraphicObject,例如Circle和   矩形,必须提供   实现用于绘制和   调整方法:

class Circle extends GraphicObject {
    void draw() {
        ...
    }
    void resize() {
        ...
    }
}
class Rectangle extends GraphicObject {
    void draw() {
        ...
    }
    void resize() {
        ...
    }
}

答案 1 :(得分:3)

对于一个真实的例子,为什么不看java.util.AbstractCollection

答案 2 :(得分:2)

对于抽象类的真实示例,让我们看一下AbstractTableModelAbstractTableModel提供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为除三种方法(getRowCountgetColumnCountgetValueAt)之外的所有方法提供了默认实现,迫使exteding类至少提供实现定义大小并向表提供数据。它还提供了对侦听器的良好默认处理,以及向这些侦听器触发事件​​的一系列便捷方法。

答案 3 :(得分:2)

在java编程语言中,abstract classes是仅作为父类或基类使用的语言 派生子类以实现从抽象类(基类)继承的方法。抽象类不直接实例化。首先扩展基类,然后实例化(创建对象)。抽象类本质上是通用的,并且实现了具有通用实现的子类通常使用的那些方法。

e.g。

abstract class A {
         public abstract abs_value();

         void show() 
                   {
                   System.out.println("This is an abstract class");
                   }
               }

答案 4 :(得分:1)

我认为这是一个常见的现实世界的例子:

这可能会远离您的要求,但我们可以说我们正在使用像Hibernate这样的ORM框架(不需要真正担心它是什么或意味着什么,只知道我们基本上会插入/更新和从数据库中检索对象)。

对于我们要插入的每个表,我们将有一个唯一的数据库访问对象(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可以执行任何特定任务,我们不会浪费任何时候重写我们已经写过的代码。代码重用的一个很好的例子。

我认为这是在行业中使用抽象类的一个非常常见的例子,所以我希望它有助于你所寻找的东西。