Nicht sicher, ob dies möglich ist, aber ich habe einen Fall, in dem zwei Schnittstellen die gleiche Methode haben. Dies sind Schnittstellen, die gegeben sind, also kann ich sie nicht ändern.Java - Generalisieren Sie verschiedene Klassen, ähnliche Methoden (ohne die Unterklassen zu ändern?)
Da Schnittstellen
interface SomeGivenService {
boolean authenticate(String username, String password);
Object someSpecialMethod(Object param);
}
interface AnotherGivenService {
boolean authenticate(String username, String password);
String aGreatMethod();
String sayHello();
}
diesen Dienst zu verbrauchen, habe ich eine Klasse und tat, falls etwas Handhabung dieser Dienst einen Fehler wirft.
class SomeGivenServiceConsumer {
SomeGivenService a;
public SomeGivenServiceConsumer(SomeGivenService a) {
this.a = a;
}
public authenticate(MyUserPassBean bean) {
try {
a.authenticate(bean.username, bean.password);
} catch (Exception e) {
throw new MyException();
}
...
}
}
class AnotherGivenServiceConsumer {
AnotherGivenService a;
public AnotherGivenServiceConsumer(AnotherGivenService a) {
this.a = a;
}
public authenticate(MyUserPassBean bean) {
try {
a.authenticate(bean.username, bean.password);
} catch (Exception e) {
throw new MyException();
}
...
}
}
Ist es möglich, diese Codeverdoppelung bei meinen Kunden zu vermeiden? Ich werde wahrscheinlich viele von ihnen haben und diesen doppelten Code vermeiden wollen. Ich dachte ursprünglich daran, meinen Consumer zu ändern, um eine Schnittstelle zu erhalten, die diese Authentifizierung implementiert, aber wie ich die gegebenen Schnittstellen nicht ändern kann, nicht sicher, ob das überhaupt möglich ist.
Ist es möglich, eine "generische Schnittstelle, die eine Methode hat?" oder ein Designmuster verwenden? Irgendwelche Ideen? Was ich versuche:
class AnotherGivenServiceConsumer {
AnotherGivenService a;
GivenServiceAuthenticable b;
public AnotherGivenServiceConsumer(AnotherGivenService a,
GivenServiceAuthenticable b) {
this.a = a;
this.b = b;
}
public authenticate(MyUserPassBean bean) throws MyException {
return b.authenticate(bean.username, bean.password);
}
}
interface GivenServiceAuthenticable<T> {
boolean authenticate(T givenService, MyUserPassBean bean);
}
class GivenServiceAuthenticableImpl<T> implements GivenServiceAuthenticable<T> {
boolean authenticate(T givenService, MyUserPassBean bean) {
try {
//this won't compile as it's a generic class..
t.authenticate(bean.username, bean.password);
} catch (Exception e) {
throw new MyException();
}
...
}
}
Anderes Problem ist, wie dieses Objekt instanziieren, wenn ich es nicht meine neue Objekte ändern kann, implementieren?
In Ihren 'authenticate' Methoden fehlt ein Rückgabetyp. – shmosel
Haben Sie viele dieser Dienstleistungen oder nur eine Menge Verbraucher? – shmosel
Haben alle Klassen, die die angegebenen Schnittstellen implementieren, die gleiche Logik für die Authentifizierung? Wenn ja, können Sie einfach eine neue "Schnittstelle" einführen, die die angegebenen Schnittstellen "erweitert" und Ihre "Consumer" diese Schnittstelle mit einer einzigen Definition für die Methode "authenticate (user, password)" implementieren lässt. – CKing