2016-06-02 6 views
1

Ich möchte wissen, was der Unterschied zwischen der Implementierung der Schnittstelle und dem Erstellen einer Instanz ist. Hier ist ein Beispiel für Code, der es ermöglicht, zwischen IntentService und Activity mit ResultReceiver zu kommunizieren .Unterschied zwischen der Implementierung einer Schnittstelle und dem Erstellen einer Instanz davon

MySimpleReceiver Klasse:

public class MySimpleReceiver extends ResultReceiver { 

public static final Creator CREATOR = null; 
private Receiver receiver; 

// Constructor takes a handler 
public MySimpleReceiver(Handler handler) { 
    super(handler); 
} 

// Setter for assigning the receiver 
public void setReceiver(Receiver receiver) { 
    this.receiver = receiver; 
} 

// Defines our event interface for communication 
public interface Receiver { 
    void onReceiveResult(int resultCode, Bundle resultData); 
} 

// Delegate method which passes the result to the receiver if the receiver 
// has been assigned 
@Override 
protected void onReceiveResult(int resultCode, Bundle resultData) { 
    if (receiver != null) { 
     receiver.onReceiveResult(resultCode, resultData); 
    } 
} 
} 

die beste Weg, um Setup der Rückruf für, wenn Daten aus dem Dienst empfangen wird:

Implementierung MySimpleReceiver.Receiver Schnittstelle im MainActivity:

public class MainActivity extends Activity implements MySimpleReceiver.Receiver 

    { 

     @Override 
     public void onReceiveResult(int resultCode, Bundle resultData) { 
      // 
     } 
    } 

oder eine Instanz von t erstellen Die Schnittstelle in der MainActivity:

public class MainActivity extends Activity { 


    public MySimpleReceiver receiverForSimple; 


    // Setup the callback for when data is received from the service 
    public void setupServiceReceiver() { 
     receiverForSimple = new MySimpleReceiver(new Handler()); 
     // This is where we specify what happens when data is received from the 
     // service 
     receiverForSimple.setReceiver(new MySimpleReceiver.Receiver() { 
      @Override 
      public void onReceiveResult(int resultCode, Bundle resultData) { 
       if (resultCode == RESULT_OK) { 
        String resultValue = resultData.getString("resultValue"); 
        Toast.makeText(MainActivity.this, resultValue, Toast.LENGTH_SHORT).show(); 
       } 
      } 
     }); 
    } 

} 

und was ist der Unterschied zwischen? Danke

Antwort

3

Sie können "eine Instanz" einer Schnittstelle nicht erstellen, nur eine Instanz einer Klasse, die es implementiert.

Eine Schnittstelle ist nichts anderes als ein bindender Vertrag, den Sie vollständig implementieren müssen.

Eine Klasse ist eine realisierte Funktionalität. Das von Ihnen angegebene Beispiel zeigt, dass Sie MySimpleReceiver.Receiver in einer anonymen Klasse überschreiben. Es sieht so aus, als ob Sie ein Interface instanziieren, aber Sie sind es nicht. Diese Klasse hat keinen Namen (daher anonym), aber ihre Implementierung ist in den geschweiften Klammern enthalten, die der neuen Anweisung folgen.

Anonyme Klassen sind sehr nützlich, aber schwer zu lesen, vor allem, wenn Sie mit älteren Versionen von Java oder anderen Sprachen vertraut sind, die diese Art von Code nicht unterstützen.

Bitte sehen the tutorial on anonymous classes here

Sie das erste Beispiel (direkte Umsetzung) verwenden würden, wenn Sie Wiederverwendung die Klasse in irgendeiner Weise wollen. Es macht Ihre Lösung jedoch etwas größer.

Das zweite Beispiel ist großartig, wenn Sie nur eine einzige Verwendung haben und keine Verbreitung von Klassendateien in Ihrer Lösung wünschen.

+0

danke, aber meine frage war: wann sollte ich den ersten code verwenden, und wann sollte ich den seconde code verwenden? –

+1

@ OtmàaneFikri - Siehe mein Update –

0

Sie können die Instanz der Schnittstelle nicht erstellen. Sie können nur die Instanz der Klasse erstellen, die diese Schnittstelle implementiert. Beispiel:

interface Calculate{ 
    void doCalculation(); 
} 

class Sample implements Calculate{ 
    @Override 
    void doCalculation(){ 
    //TODO Write your code to calculate 
    } 
} 

// ====================================== = //

Calculate calculate = new Sample(); 
calculate.doCalculation();