这是我大学的学习资料中引用的问题。
对我来说完全没有意义。
对于我来说,钩子是(通常是顺序但不仅仅是)程序中的指定点,您可以在其中指定自己的方法或要执行的回调。
例如,一个应用程序有一个“on before before hook”,我可以在那里注册我的回调方法,在关机之前将用户数据保存到磁盘。
抽象方法是自我解释。
对我而言,这是完全不同的东西?或者这些事情中的任何一个都具有我不知道的第二个含义?我做了一个快速搜索,但没有找到任何东西。
答案 0 :(得分: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() { }
}
在此示例中,您可以在DefaultActionDoer
中覆盖可以更改功能的挂钩,但这些挂钩不是必需的。这与抽象方法类似,因为抽象方法需要来覆盖以定义功能。
答案 1 :(得分:4)
对我而言,这是完全不同的东西?
它们都是将代码推迟到客户端类(类的用户)的方法:
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
,并选择提供客户端可以实现并注册SimpleCursorAdapter实例的ViewBinder
接口。 ViewBinder
实例必须提供将特定数据绑定到特定UI小部件的setViewValue
方法。
与SimpleCursorAdapter
的一个关键区别是提供ViewBinder
是可选的,这是钩子方法的优势之一。
答案 2 :(得分:3)
就个人而言,在询问StackOverflow社区之前,我会去找教授并要求澄清。
...但是,据说,我相信(如果你的钩子的描述是正确的)任何类都可以为钩子注册回调方法,而抽象方法强制子类a实现自己的算法给定的方法。
答案 3 :(得分:3)
确实存在一些概念与实现细节的混淆。
基本上你的理解是正确的。
引用OP的陈述, 是:
挂钩是指定的点,开发人员可以指定要执行的方法或回调。
Javascript语言可能是允许所有内容被钩住的最(臭名昭着)语言。 (作为旁注:谷歌有一个安全漏洞,涉及Javascript数组构造函数被挂钩)
实现抽象方法/回调接口是在java代码中实现回调的机制如何。
答案 4 :(得分:3)
抽象方法是实现“钩子”的一种方式。钩子可以通过回调,观察者模式,插件来实现......任何方式你都希望指定外部的一些代码在应用程序中的重要点(称为钩子)上运行。
答案 5 :(得分:0)
hook 是一个古老的术语,可能追溯到20世纪80年代之前。从你的问题中不清楚是否"在Java"适用于Hooks和Abstract Methods,但如果我是教授(!),我认为了解钩子的历史(在Java之前)是很重要的。
维基百科页面详细介绍了Hooking。就个人而言,当我想到 hook 时,我想到了允许运行时自定义的机制。
以下是http://www.tldp.org/LDP/Linux-Dictionary/html/h.html
中的一些定义软件或硬件产品中包含的功能,可让爱好者和程序员添加自己的自定义功能。来自QUECID
将代码插入系统调用以便更改它的技术。典型的钩子通过将函数指针替换为自己的调用来工作,然后一旦完成它的处理,它就会调用原始函数指针。来自Hacking-Lexicon
对于 Java中的抽象方法,在Bert F's answer中已经很好地解释了它。我强调,与钩子的一般概念(允许自定义)不同,抽象方法需要规范,这意味着没有默认定义。