Frage
Ich bin eine Login-Seite in Wicket von Java zu schreiben und möchte es als allgemein schreiben wie möglich, so muss ich in die Klasse übergeben eine Funktion, die berühmt als Funktion Zeiger in C ++. Die Klasse ist:
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);
}
}
}
wo beglaubigen ist die Funktion, was soll ich tun?
Lösung
nur eine Schnittstelle übergeben, die die authenticate
Methode definiert.
void DoSomething(IAuthenticationProvider authProvider) {
// ...
authProvider.authenticate();
}
Andere Tipps
Sie können die innere Klasse verwenden
In Java gibt es nichts Aufruf Funktionszeiger eher es Funktionsobjekt ist. In diesem können Sie Objekt, deren Methoden führt Operation an den anderen Objekten definieren. z.
class MyClass
{
public void myFunction(String s1, String s2)
{
return s1.length() - s2.length();
}
}
MyClass m = new MyClass();
m.myFunction("nnnnnn", "mmmmmmmmmmm");
Dies ist nichts anderes als Funktionsobjekt. Wenn wir Code folgen Regel Schnittstelle, dann können wir eine Schnittstelle definieren und Generika als auch nutzen können.
public interface MyInterface<T>
{
public void myFunction(T s1, T s2);
}
Nun kann die ursprüngliche Klasse diese Schnittstelle implementieren. Das obige Beispiel ist nur eine einfache Modifikation des Komparator-Schnittstelle Beispiels. Wenn Sie keine konkrete Klasse möchten, können Sie auch anonyme Klasse verwenden.
Arrays.sort(stringArray, new Comparator <String> ()
{
public int compare(String s1, String s2)
{
return s1.length() - s2.length();
}
};
);
Hoffe, es hilft.