2016-11-30 13 views
1

Ich habe zwei Klassen Apple- und orange wie folgt aus:Wie in demselben Verfahren aus zwei verschiedenen Klassen nennen java

public final class Apple{ 
    int getJuice(); 
} 
public final class Orange{ 
    int getJuice(); 
} 

und ich kann sie nicht ändern. Ich habe dritte Klasse fruitsManeger wie folgt aus:

class FruitManeger { 
    Apple apple; 
    Orange orange; 

    enum Fruits{ 
     Apple,Orange 
    } 

    Fruits favorFruits;  

    int getJoice(){ 
     if(favorFruits==Fruits.Apple){ 
       apple.getJuice(); 
     }else if(favorFruits==Fruits.Orange){ 
       orange.getJuice(); 
     } 
    } 

} 

Meine Frage: was ist am besten Weg getJuice Methode in FruitManeger Klasse zu implementieren ?.

wie Sie sehen können, wenn ich eine Menge Früchte habe, sollte ich eine Menge von hinzufügen, wenn sonst Ablauf.

natürlich kann ich Reflection verwenden, um Methoden namentlich zu nennen, aber es ist keine gute Idee, wenn getJuice-Methode ein Objekt zurückgibt und Sie etwas damit gleich machen wollen.

Gibt es einen besseren Weg?

+0

ich kann nicht Apfel und Orange Klasse ändern – max

+0

Wir müssen nur fragen, warum Sie nicht Apple und Orange ... ändern können, weil die riesige Menge an if/Case-Anweisungen Sie eine direkte Folge davon ist, bräuchten. Übrigens können Sie Reflection auch für das zurückgegebene Objekt verwenden ... Sie würden einfach mehr if/case-Anweisungen benötigen. –

+0

weil Apple und Orange ist in Java-Bibliothek – max

Antwort

10

gibt es einen besseren Weg?

Ja, Umgestalten, dass die Anwendung in einer oop Weise ...

Denken Sie daran: Sie sind nicht Apple oder orange ändern kann, aber OOP können Sie diese Klassen sicher erstrecken, da sie nicht endgültig sind ...

class CorrectApple extends Apple implement IJuiceble{ 
    @Override 
    int getJuice(); 
} 
class CorrectOrange extends Orange implement IJuiceble{ 
    @Override 
    int getJuice(); 
} 

jetzt die

interface IJuiceble{ 
    int getJuice(); 
} 

und schließlich der Manager:

class FruitManeger { 
    private CorrectApple apple; 
    private CorrectOrange orange; 

    int getJoice(IJuiceble correctfruit){ 
     return correctfruit.getJuice(); 
    } 
} 
+0

Entschuldigung, aber sie sind. Siehe meine bearbeitete Frage – max

+0

ein bewegliches Ziel –

+0

@max gut, wenn Sie nicht die richtige/vollständige Informationen dann diese Antwort nicht einmal kompilieren wird ... und mein Design ist jetzt nutzlos .... –

-1

Durch Bezugnahme dieses Answer

interface IScalable { 
    void setScale(int scale); 
    int getScale(); 
} 

class DataSizeAction extends EncoderAction implements IScalable { 
    ... 
} 

class SomeoneElse { 
    private int scale = 2; 

    public void setScale(IScalable scalable) { 
     scalable.setScale(this.scale); 
    } 
} 
+1

Die Frage, aus welchem ​​Grund auch immer, die Klassen Apple und Orange können nicht geändert werden, und sie implementieren oder erweitern nichts. –

1

können Sie Schalter anstelle von if/else.

class FruitManager { 
    Apple apple; 
    Orange orange; 

    enum Fruits { 
     Apple, Orange 
    } 

    Fruits favorFruits; 

    int getJoice() { 
     switch (favorFruits) { 
     case Apple: 
      apple.getJuice(); 
      break; 
     case Orange: 
      orange.getJuice(); 
      break; 

     default: 
      System.err.println("Fruit not found. " + favorFruits); 
     } 
    } 
+0

Je mehr Früchte du im Manager hast, desto größer ist der Schalterfall und die Enum .... –

+1

Es ist eine schlechte Lösung, aber ist eine Lösung für die Frage. Ich bevorzuge auch die Schnittstellenlösung. – jklee

+1

Ich mag die Art, wie Sie sich trotzdem näherten \ –

Verwandte Themen