Methode, um ein Klassenobjekt oder ein anderes Klassenobjekt zu akzeptieren

8

Ich habe zwei Methoden wie die folgenden

%Vor%

Meine Katzen- und Hundeklasse sind wie folgt

%Vor%

Um Redundanz zu vermeiden, wollte ich die beiden obigen Methoden in eine einzige generische Methode konvertieren.

Ich habe Folgendes versucht

%Vor%

Aber es funktioniert nicht, da es beschwert, dass das generische T nicht getName oder getId

hat

Hier sind Cat und Dog eingebaute Java-Klassen. Als Ergebnis führe ich CAN NOT Vererbung aus und stelle eine Superklasse Animal für sie mit name und id als Datenvariablen zur Verfügung.

Gibt es eine Möglichkeit, die beiden obigen Methoden zusammenzuführen, ohne die Vererbung zu implementieren?

    
Philip John 16.03.2016, 09:34
quelle

7 Antworten

1

Ok, ich weiß, dass Sie keine Art von Vererbung verwenden können. Hier ist eine kurze Lösung mit Reflection API:

%Vor%     
Cootri 16.03.2016, 09:58
quelle
4

Eine andere Möglichkeit: Wenn Sie Java 8 verwenden, könnten Sie die Getter-Methoden für Name und ID als zusätzliche Parameter in die Methode einbinden. Dies ist typsicher und erfordert weder Reflektion noch Änderungen an den ursprünglichen Klassen.

%Vor%

Oder kürzer, mit Streams:

%Vor%

Verwendung:

%Vor%

Natürlich ist der body der Methode in allen Fällen derselbe, aber Sie müssen auf verschiedene Arten aufrufen, abhängig von der Eingabe. Dazu könnten Sie eine Eingabemethode bereitstellen, die andere Methode in der entsprechenden Weise aufrufen oder eine Ausnahme auslösen, falls der Typ falsch ist.

%Vor%     
tobias_k 16.03.2016 10:39
quelle
1

Sie müssen eine gemeinsame Schnittstelle für Cat und Dog definieren, zum Beispiel Animal .

Dann können Sie einen List<Animal> als Parameter übergeben.

    
Davide Lorenzo MARINO 16.03.2016 09:40
quelle
1

Können Sie nur eine Schnittstelle für Hund und Katze herstellen?

%Vor%

dann würde Ihre Methode

werden %Vor%

In Bezug auf die eingebaute Klasse, die Sie erwähnt haben, können Sie sie in eine andere Klasse einfügen und implementieren die Schnittstelle (oder Superklasse), die das gewünschte Verhalten beschreibt.

Ich musste einmal die gleiche Schnittstelle für log4j und logback event Object bereitstellen, sie sind definitiv sehr unterschiedlich.

Hier geht der Wrapper ..

%Vor%

Und die Kindklasse, die die eingebaute Klasse enthält

%Vor%

Die LogbackEvent-Klasse ist der Log4jEvent-Klasse sehr ähnlich, und in anderen Teilen des Codes gibt es viele Methoden, die den Argumenttyp von EventWrapper erhalten. Vielleicht würde dieser Fall Ihnen helfen, Ihre Lösung zu entwickeln.

    
Adrian Seungjin Lee 16.03.2016 09:41
quelle
0

Sie sollten die Reflection-API verwenden, wenn Sie die Kategorien Cat und Dog nicht ändern können. Ansonsten benutze die Schnittstelle Animal (oder type casting)

    
Cootri 16.03.2016 09:38
quelle
0

Die einfachste Lösung, die ich mir vorstellen kann (die Vererbung beiseite zu lassen), ist zu überprüfen, ob das Objekt vom Typ Hund oder Katze ist. Es folgt der Code für die Methode: -

%Vor%

Es verwendet jedoch keine Generika.

    
Bilesh Ganguly 16.03.2016 09:46
quelle
0

Wenn es kein Problem mehr Linien innerhalb der Methode hat. Was ist damit?

%Vor%

Ein allgemeinerer Ansatz wäre das:

%Vor%     
Alexander 16.03.2016 09:47
quelle

Tags und Links