Java中钩子和抽象方法之间的区别
这是我大学学习材料中引用的一个问题。
这对我来说完全没有意义。
对我来说,钩子是程序中的指定点(主要是顺序的,但不仅仅是),您可以在其中指定自己的方法或要执行的回调。
例如,一个应用程序有一个“关机前的钩子”,我可以在那里注册我的回调方法,在关机之前将用户数据保存到磁盘。
抽象方法是自我解释的。
对我来说,这是完全不同的东西吗?还是这些事情中的任何一个都有我不知道的第二个含义?我做了一个快速搜索,但没有找到任何东西。
这是我大学学习材料中引用的一个问题。
这对我来说完全没有意义。
对我来说,钩子是程序中的指定点(主要是顺序的,但不仅仅是),您可以在其中指定自己的方法或要执行的回调。
例如,一个应用程序有一个“关机前的钩子”,我可以在那里注册我的回调方法,在关机之前将用户数据保存到磁盘。
抽象方法是自我解释的。
对我来说,这是完全不同的东西吗?还是这些事情中的任何一个都有我不知道的第二个含义?我做了一个快速搜索,但没有找到任何东西。
我真的不认为这两件事非常相似。它们可以相关的一种方式可以在下面演示:
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() { }
}
在此示例中,您有可以覆盖的钩子以更改功能,但它们不是必需的。这类似于抽象方法,因为需要重写抽象方法以定义功能。DefaultActionDoer
对我来说,这是完全不同的东西吗?
它们都是将代码推迟到客户端类(类的用户)的方法:
1) 定义一个抽象方法
2) 定义钩子
当然,有各种各样的原因可以解释为什么你会使用一种方法而不是另一种方法。例如,钩子方法允许您注册多个回调。但是抽象方法提供了对类(受保护的方法和ivars)的更直接的访问。
这可能是太多的信息,但在Android编程中,你会看到两者:
您可以提供 将数据源与 UI 小组件关联的 。CursorAdapter
http://developer.android.com/reference/android/widget/CursorAdapter.html
此类是抽象的,具有两个方法,用于将数据实际绑定到 UI 小部件。类必须子类才能使用此类。newView
bindView
但是,的子类是CursorAdapter
SimpleCursorAdapter
http://developer.android.com/reference/android/widget/SimpleCursorAdapter.html
此类实现并选择提供一个接口,客户端可以实现该接口并将其注册到 SimpleCursorAdapter 实例。实例必须提供将特定数据片段绑定到特定 UI 小组件的方法。newView
bindView
ViewBinder
ViewBinder
setViewValue
与的一个关键区别是,提供 a 是可选的,这是 hook 方法的优点之一。SimpleCursorAdapter
ViewBinder