2016-04-19 7 views
1

Ich arbeite an einer einfachen Rechnerzuweisung, bei der ich ein Java-Interface bei der Implementierung des Codes verwenden muss. Ich habe die Schnittstelle wie folgt festgelegt:Aufrufen einer nicht statischen Methode beim Implementieren einer Schnittstelle mit Java

public interface OperationInterface { 

    // create symbolic constants to define operation options 
    static final int ADDITION = 1; 
    static final int SUBTRACTION = 2; 
    static final int MULTIPLICATION = 3; 
    static final int DIVISION = 4; 

    // return answer to requested calculation as a string 
    public String toString(int argumentOne, int argumentTwo); 
} 

ich dann auf ‚Hinzufügen‘ Klasse wie folgt:

public class Add implements OperationInterface { 
    // override toString method by returning answer to calculation as a string 
    public String toString(int argumentOne, int argumentTwo) 
    { 
     return "" + (argumentOne + argumentTwo); 
    } 
} 

ich dann diese Add.toString() -Methode von meinem Klienten zu nennen versuchen verfahren wie folgt:

mOut.print(Add.toString(argumentOne, argumentTwo)); 

wo ist ein ActivityInterface. Mein derzeitiges Problem ist, dass toString in Android Studio rot unterstrichen ist mit dem Fehler 'Nicht-statische Methode toString (int, int) kann nicht aus einem statischen Kontext referenziert werden. Wenn ich die toString-Methode statisch mache, erhalte ich einen anderen Fehler in der Add-Klasse. Ich schätze, meine Herangehensweise ist falsch, und ich würde mich über einige Hinweise freuen.

Außerdem möchte ich meine statischen final int verwenden, um zu bestimmen, welche Klasse aufgerufen werden soll, z. if (operation == ADDITION), dann rufe Add.toString (int, int) und ähnliches mit einer Subtract, Multiply und Divide Klasse auf. Ich sehe derzeit keinen Weg, dies zu tun, würde also jede Anleitung wirklich schätzen. Dank

+1

Was ist der andere Fehler? Vielleicht möchten Sie die Bedeutung des Begriffs "statisch" erforschen. – SomeJavaGuy

Antwort

4

Ihre Schnittstelle definiert Instanz -spezifische Verhalten, aber Sie versuchen Add.toString zu nennen, als ob es sich um eine statische Methode waren. Es ist nicht, es ist eine Instanzmethode.

switch (operation) { 
    case ADDITION: 
     // ... 
     break; 
    case SUBTRACTION: 
     // ... 
     break; 
    //...and so on... 
} 

:

Add a = new Add(); 
mOut.print(a.toString(argumentOne, argumentTwo)); 

Im Hinblick auf die Entscheidung, welche den Betrieb zu verwenden, basierend auf einer operation Variable, würde ich wahrscheinlich eine switch verwenden:

eine Instanz Methode zu verwenden, können Sie eine Instanz haben müssen Denken Sie daran, eine default Klausel zu haben.

Es gibt andere Möglichkeiten, die im Produktionscode verwendet werden können (oder nicht) (unter Verwendung von Map<Integer,OperationInterface>), aber switch ist wahrscheinlich der einfachste und unkomplizierteste für Hausaufgaben.

Sein wirklich vorsichtig nicht wirklich hier, um die Hausaufgaben zu machen (wie es ein schlechter Dienst an Sie, zu leugnen, die Lernmöglichkeit wäre), aber Sie würden wahrscheinlich die switch-erstellen die Instanz verwenden, aber nicht beschränkt auf Führen Sie den tatsächlichen Anruf zu toString. Zum Beispiel würde der Code

  • Deklarieren Sie die Variable ohne Anfangswert
  • Einsatz in sehr rauen Bedingungen sein switch eine geeignete Instanz, um es nach dem switch, rufen
  • zuweisen toString auf sie

Das bedeutet, dass die Variable vom Typ OperationInterface, nicht Add (oder Subtract usw.) sein muss. Das ist wahrscheinlich ein großer Teil des Punktes der Übung.


Randbemerkung: Eher mit einer leeren Zeichenfolge als Verkettung eines int in eine Zeichenfolge zu konvertieren, z.B.

return "" + (argumentOne + argumentTwo); 

betrachten String.valueOf(int), z.B .:

return String.valueOf(argumentOne + argumentTwo); 
+0

Das ist ausgezeichnet und danke auch für den Saitenteil. Wie wäre es mit der Variable 'operation' (Wert zwischen 1 und 4), um die zugehörige Klasse Add, Subtract, Multiply oder Divide direkt aufzurufen? Es bedeutet, dass ich für diesen letzten Teil keine if/else-Anweisung verwenden sollte. –

+0

@SteveW: Ich habe die Antwort erweitert, um das zu bedecken. Ich hoffe, es gibt Ihnen genug, um damit zu arbeiten, ohne Ihnen zu viel zu geben. Ich versuche vorsichtig zu sein, ohne zu arbeiten, denn wie verlockend es auch ist, nur ein vollständiges Beispiel zu zeigen, das wäre für Sie ein Nachteil. –

+0

Danke nochmal. Ich bin mir bewusst, wechseln - nur ein weiterer Weg, um zu tun, wenn/sonst imo. Aber deine anderen Hinweise haben meine Gedanken zum Laufen gebracht, also denke ich, dass ich einen guten Weg nach vorne sehen kann. –

0

Ihre „toString“ Methode nicht statisch ist, so kann es nicht, ohne ein Objekt für die Klasse aufgerufen werden, in denen es vorhanden ist.

Ihr Code wird funktionieren, wenn die Methode "toString" eine statische Methode ist, da statische Methoden zu der Klasse und nicht zum Objekt gehören, können Sie sie direkt mit dem Klassennamen aufrufen. Deshalb heißt es "Nicht-statische Methode toString (int, int) kann nicht aus einem statischen Kontext referenziert werden", weil Sie versuchen, auf eine Methode zuzugreifen, die statisch nicht statisch ist.

Erstellen Sie ein Objekt für die Klasse und rufen Sie die gewünschte Methode daraus auf.

Verwandte Themen