我正在用java编写一个在wicket中的Login页面,并希望尽可能将其编写为通用,因此我需要将一个在C ++中作为函数指针着名的函数传递给类。 课程是:
class LoginForm extends Form
{
public LoginForm(String id,TextField username,TextField password,WebResponse webResponse)
{
super(id);
}
@Override
public void onSubmit()
{
String password = Login.this.getPassword();
String userId = Login.this.getUserId();
String role = authenticate(userId, password);
if (role != null)
{
if (Login.this.getSave())
{
utilities.CreateCookie("Username", userId, false, 1209600, (WebResponse) getRequestCycle().getResponse());
utilities.CreateCookie("Password", password, false, 1209600, (WebResponse) getRequestCycle().getResponse());
}
User loggedInUser = new User(userId, role);
WiaSession session = (WiaSession) getSession();
session.setUser(loggedInUser);
if (!continueToOriginalDestination())
{
setResponsePage(UserHome.class);
}
}
else
{
wrongUserPass.setVisible(true);
}
}
}
身份验证是该功能我该怎么办?
答案 0 :(得分:9)
只需传递定义authenticate
方法的接口。
void DoSomething(IAuthenticationProvider authProvider) {
// ...
authProvider.authenticate();
}
答案 1 :(得分:1)
您可以使用内部类
答案 2 :(得分:0)
在java中没有调用函数指针而是函数对象。在此,您可以定义其方法对其他对象执行操作的对象。 e.g。
class MyClass
{
public void myFunction(String s1, String s2)
{
return s1.length() - s2.length();
}
}
MyClass m = new MyClass();
m.myFunction("nnnnnn", "mmmmmmmmmmm");
这不过是功能对象。如果我们遵循代码接口规则,那么我们可以定义一个接口,也可以使用泛型。
public interface MyInterface<T>
{
public void myFunction(T s1, T s2);
}
现在原始类可以实现此接口。上面的例子只是对Comparator接口示例的一个简单修改。如果你不想要具体类,你也可以使用匿名类。
Arrays.sort(stringArray, new Comparator <String> ()
{
public int compare(String s1, String s2)
{
return s1.length() - s2.length();
}
};
);
希望它有所帮助。