Co zrobić, jeśli klasy o tym samym interfejsie mają podobny, ale inny podpis metody?Co zrobić, jeśli klasy o tym samym interfejsie mają podobny, ale inny podpis metody?
Załóżmy, że mam projekt do obliczenia różnych kosztów (aby ostatecznie uzyskać całkowity koszt).
W moim programie jest kilka klas kalkulatora, a mianowicie ACostCalculator
, BCostCalculator
i tak dalej. Kiedy wywoływana jest metoda calculate()
w celu obliczenia kosztu, kontener kosztowy jest również przekazywany do tych kalkulatorów kosztów. W dobrym scenariuszu mogę utworzyć interfejs CostCalculator
dla każdego kalkulatora kosztów.
Jednak obliczenia dla różnych kosztów wymagały różnych zasobów. W moim bieżącym programie wygląda to tak:
//getResource() are costly method while several costs need this. So do it outside calculate() method.
ResourceA resourceA = getResourceA();
ResourceB resourceB = getResourceB();
CostContainer costContainer = new CostContainer();
CostCalculator aCostCalculator = new ACostCalculator();
...
CostCalculator eCostCalculator = new ECostCalculator();
aCostCalculator.calculate(costContainer);
bCostCalculator.calculate(costContainer)
cCostCalculator.calculate(costContainer, resourceA);
dCostCalculator.calculate(costContainer, resourceA);
eCostCalculator.calculate(costContainer, resourceA, resourceB);
Jeśli podpis jest dokładnie taki sam, mogę wykonać pętlę wygodnie, aby zrobić to za jednym razem. Jednak ponieważ są one podobne, ale różne, nie mogę nawet stworzyć dobrego interfejsu.
Nie jestem pewien, czy istnieją na to dobre sposoby. Co mogę pomyśleć, to uogólniając wszystkie calculate()
metodę do
calculate(CostContainer costContainer, List<Object> resources);
Jakieś pomysły? Dzięki za odpowiedź.
... lub varargs zamiast listy. –