Ich habe eine Basisklasse namens "Entity", die eine statische Methode namens "construct" hat, die eine Entity-Instanz zurückgibt. Ich habe mehrere verschiedene Unterklassen dieser Klasse (für die Demonstration nehmen wir an, dass "Obst" und "Gemüse" als Unterklassen verwendet werden). Ich möchte in der Lage sein, etwas in den folgenden Zeilen zu tun:
%Vor%someFunction würde dann Textdatei an Fruit.construct übergeben und die generierte Entität zurückgeben. Gibt es einen einfachen Weg, dies zu tun?
Verwenden Sie stattdessen ein Werksmuster .
Übergeben Sie die Textdatei an die Factory-Methode, die sie verwendet, um die richtige konkrete Instanz von Entity
Übergeben Sie Fruit.class
an die Funktion und verwenden Sie dann die Reflektion für dieses Klassenobjekt, um den richtigen Konstruktor aufzurufen. Beachten Sie, dass dies Ihre Superklasse ziemlich eng an ihre Unterklassen koppelt, indem Sie fordern, dass der Konstruktor existiert.
Du meinst so etwas:
%Vor%Der obige Code wird den Konstruktor no-arguments der Klasse verwenden (vorausgesetzt, es gibt einen).
Wenn Ihre Klasse mit einem bestimmten Konstruktor instanziiert werden muss, können Sie diesem Beispiel folgen:
%Vor% Fruit
in Ihrem Beispiel ist ein Typ, und während Fruit.eat()
sich auf eine statische Methode bezieht, ist Fruit
keine "statische Klasse".
Es gibt ein "Klassenobjekt", das eigentlich ein Object
ist, das die Klasse darstellt. Übergeben Sie es stattdessen. Um dorthin zu gelangen, wird die Syntax Fruit.class
verwendet.
Statische Methoden werden per se nicht vererbt, wenn der Code Entity.construct (...) enthält, wird er nicht dynamisch mit der Unterklasse verknüpft.
Der beste Weg, um das zu erreichen, was Sie verlangen, ist die Verwendung von reflection, um die construct-Methode für die Fruit-Klasse aufzurufen (oder welche Klasse auch immer in die someFunction () -Methode übergeben wurde.
)Sie versuchen, ein objektorientiertes Entwurfsmuster, Strategie , zu implementieren, indem Sie prozeduralen Code verwenden. Tu es nicht.
Erstellen Sie stattdessen eine Schnittstelle namens EntityConstructor
, die die Methode construct()
definiert. Machen Sie Fruit
und Vegetable
diese Schnittstelle implementieren. Ändern Sie dann someFunction()
, um eine Instanz dieser Schnittstelle zu übernehmen.
Tags und Links java design-patterns