什么是抽象类中非抽象空方法的含义

时间:2016-11-09 09:15:14

标签: java abstract-class

我正在阅读一些源代码,并且无法弄清楚为什么抽象类中有两个非抽象的空方法。

抽象类就像:

CREATE OR REPLACE FUNCTION test.mytest(param varchar)
RETURNS SETOF record
LANGUAGE sql
AS
$body$
SELECT * from test.mytable;
$body$
VOLATILE;

只有其中一个具体类覆盖并使用它们,但我可以直接在具体类中实现这些方法吗?所以我想知道它们是否可以被取消,它们的用途是什么?

4 个答案:

答案 0 :(得分:3)

对我而言,这是一种代码味道。这就是原因:

  1. 如果这些方法无意义,为什么它们存在?
  2. 如果他们打算定义一个行为,他们会有一个实现(除了空),并且会被final表达出来。
  3. 如果他们打算被覆盖,那么意图显然不是 表达是因为没有人会知道这些方法必须是这样的 覆盖,因此应该abstract
  4. 要消除这种气味,我会删除它们或制作它们abstract

答案 1 :(得分:2)

虽然不是最常见的情况,但有时它在模板方法的上下文中很方便。在这种情况下,有一个定义流的方法,将一些部分的具体实现留给其子类。在某些情况下,默认的具体行为是什么都不做,

  

将基类中的具体方法留空,但允许   通过覆盖子类中的自定义

答案 2 :(得分:1)

究竟是什么,如果空方法有一些代码。这些方法被认为是实施的。由于只有一个具体类实现了这个抽象类,所以空方法没有意义。

答案 3 :(得分:1)

这对于覆盖某些内容是可选的情况非常有用。例如,在java.awt.event中,有一个接口:

public interface MouseListener extends EventListener {
    public void mouseClicked(MouseEvent e);
    public void mousePressed(MouseEvent e);
    public void mouseReleased(MouseEvent e);
    public void mouseEntered(MouseEvent e);
    public void mouseExited(MouseEvent e);
}

然后有一个抽象类:

public abstract class MouseAdapter implements MouseListener, MouseWheelListener, MouseMotionListener {

有很多空实现。因此,您可以扩展适配器而不是实现接口,而只覆盖您真正感兴趣的方法,而无需为您甚至不关心的所有方法添加空实现。

这使得实现更加精细和紧凑。