Java中钩子和抽象方法的区别

The*_*can 13 java methods abstract

这是我大学的学习资料中引用的问题.

这对我来说完全没有意义.

对我来说,钩子是(大多数顺序但不仅仅是)程序中的指定点,您可以在其中指定自己的方法或要执行的回调.

例如,一个应用程序有一个"on before before hook",我可以在那里注册我的回调方法,在关机之前将用户数据保存到磁盘.

抽象方法是自我解释.

对我来说这是完全不同的东西?或者这些事情中的任何一个都具有我不知道的第二个含义?我做了一个快速搜索,但没有找到任何东西.

jjn*_*guy 13

我真的不认为这两件事非常相似.他们可能相关的一种方式可以通过以下方式证明:

public abstract class AbstractActionDoer() {
    public void doAction(Action act) {
        beforeAction();
        act.do();
        afterAction();
    }
    protected abstract void beforeAction();
    protected abstract void afterAtion();
}

public class DefaultActionDoer() extends AbstractActionDoer {
    public void doAction(Action act) {
        beforeAction();
        act.do();
        afterAction();
    }
    // default empty implementation
    protected void beforeAction() { }
    protected void afterAtion() { }
}
Run Code Online (Sandbox Code Playgroud)

在此示例中,您可以覆盖DefaultActionDoer可以更改功能的挂钩,但它们不是必需的.这类似于抽象方法,因为需要重写抽象方法来定义功能.


Jua*_*des 5

抽象方法是实现“钩子”的一种方式。钩子可以通过回调、观察者模式、插件来实现...任何您想要指定外部代码在应用程序中的重要点(称为钩子)运行的方式。


Ber*_*t F 5

对我来说这是完全不同的东西吗?

它们都是将代码延迟到客户端类(您的类的用户)的方法:

1) 定义抽象方法

  • 类中的其他方法调用抽象方法。
  • 该类的客户必须扩展该类以提供缺少的代码。

2)定义一个钩子

  • 该类有一个关联的回调接口(它只是一堆抽象方法)。
  • 类的方法调用回调方法。
  • 类的客户端必须实现关联的回调并注册它以提供丢失的代码。

当然,您使用一种方法而不是另一种方法有多种原因。例如,钩子方法允许您注册多个回调。但是抽象方法提供了对类(受保护的方法和 ivars)的更直接的访问。


这可能是太多信息,但在 android 编程中,您会看到两者:

您可以提供 将CursorAdapter数据源关联到 UI 小部件。

http://developer.android.com/reference/android/widget/CursorAdapter.html

这个类是抽象的,有两个方法newView,bindView它们将数据实际绑定到 UI 小部件。类必须子类化才能使用这个类。


然而,一个子类CursorAdapter是SimpleCursorAdapter

http://developer.android.com/reference/android/widget/SimpleCursorAdapter.html

此类实现newView并bindView选择提供一个ViewBinder接口,客户端可以实现该接口并向 SimpleCursorAdapter 实例注册。该ViewBinder实例必须提供将setViewValue特定数据段绑定到特定 UI 小部件的方法。

与的一个关键区别SimpleCursorAdapter是提供 aViewBinder是可选的,这是 hook 方法的优点之一。


Jus*_*ner 3

就我个人而言,在询问 StackOverflow 社区之前,我会去找教授并要求澄清。

...但是,话虽如此,我相信(如果您对钩子的描述是正确的)任何类都可以为钩子注册回调方法,而抽象方法则强制子类 a 为给定方法实现自己的算法。

  • 问教授可没那么容易。这里不是一个很好的学术体系......但是这是一个与编程相关的问题,所以我想尝试一下。 (3认同)
  • 为什么假设他还没有问过教授呢?考虑到被问到的家庭作业问题的数量(并在 SO 上得到回答),在这里问它是完全合理的 (2认同)
  • 蛇蝎不会增加价值。不要抱怨人们指出了这一点。移除蛇蝎。 (2认同)