2017-12-03 3 views
1

Ich arbeite derzeit an einem großen Projekt, das drei verschiedene Arten von CRUD enthält. Meine ICrud-Schnittstelle enthält die <t>, um den gewünschten Datentyp bei der Implementierung einzufügen.Schnittstelle Konflikte Java

Mein Problem ist, dass wenn ich es in meiner dritten Klasse implementieren, möchte ich eine der Methoden (readAll) verwenden einen anderen Datentyp als die 4 anderen Methoden (CRUD). Ist das in irgendeiner Weise möglich?

Im Moment habe ich die readAll-Methode den passenden Datentyp zurückgeben, aber Null zurückgeben, weil es nicht verwendet wird, und stattdessen eine andere Methode readall2() erstellt, die den richtigen Datentyp zurückgibt, aber nicht Teil meiner Schnittstelle ist.

Die ICrud Schnittstelle:

public interface ICrud<T> { 

List<T> readAll(); 

List<T> read(int cvr); 

void create(T t); 

void delete(int cvr); 

void update(T t, int id); 
} 

, wie ich es umsetzen:

@Service 
public class AdminRepository implements Ilogin<Admin>, ICrud<Driver>, 
IAdmin<Company> 

, wie ich die ReadAll nutzen möchten:

für alle
public List<Company> readAll() 

(nicht Treiber, sondern Treiber andere Methoden in der Schnittstelle)

Und ich möchte hinzufügen; Zuerst hatte ich das ReadAll in iAdmin, weil es Unternehmen braucht, aber ich habe diese Readall-Methode in 6 anderen Klassen, die auch ICrud implementiert.

Danke für jede Hilfe. :)

+1

Bitte geben Sie ein Beispiel Ihrer Schnittstellendefinitionen an, um Ihre Beschreibung besser zu verdeutlichen. –

+0

In der Tat ist es äußerst unklar, was das Problem ohne ein konkretes Beispiel ist. –

Antwort

1

Sie ein Design-Problem haben, empfehle ich Ihnen, lesen Sie über SOLID Prinzipien in den folgenden Link:

https://scotch.io/bar-talk/s-o-l-i-d-the-first-five-principles-of-object-oriented-design

In einem richtigen Design, sollten Sie nicht überhaupt eine Schnittstelle implementieren, wenn Sie werden nicht implementieren Sie eine seiner Methoden (die readAll ich Ihren Fall). Das heißt, Sie mischen Bedenken und Ihre Schnittstelle muss in kleinere Schnittstellen aufgeteilt werden. Vielleicht löst das Aufteilen des Readalls in eine separate Schnittstelle Ihr Problem. Beispielsweise erstellen Sie anstelle von ICrud eine Schnittstelle für Schreibvorgänge, eine für Leseoperationen und eine für readAll.

Es gibt viele Möglichkeiten, Ihr Problem zu lösen, indem Sie die Schnittstelle ICrud beibehalten, wie z. B. die Verwendung eines Objekts als Retrun-Typ oder von Generika oder Dynamiken. Aber was Ihr Problem von seinen Wurzeln löst, ist ein gutes Design, wie ich oben erwähnt habe.

+0

Ja, das macht Sinn, wir lernen immer noch über Designmuster in der Schule und es scheint eine gute Idee zu sein, eines hier anzuwenden. Sprich ich wollte abgeschnittene Ecken überspringen, wäre es möglich in der Klasse, wo ich implementiere, einfach ICrud zu sagen und dann weiter unten in der Methode anzugeben? – ITGuru

+1

Nein, ich habe Ihre Ergänzung des Codes nicht gesehen, wenn ich geantwortet habe, aber trotzdem gilt mein Rat. Ihre Verwendung von Generika ist besser als die Verwendung von Objekt. Aber immer noch mein Rat ist, den ReadAll in einer anderen Schnittstelle zu trennen, wie IReadAll diese Weise können Sie zwei Schnittstellen haben IWriteCruds und IReadAll , wenn Sie diejenigen implementieren können Sie ersetzen IWriteCruds und IReadAll . – RaniDevpr

+0

Das ist ein guter Punkt, ich werde das tun. In Zukunft werden so viele Schnittstellen entstehen, wie behalten Sie diese im Auge? Sie in Ordnern sortieren? – ITGuru