2010-12-29 3 views
14

Ich habe eine Schnittstelle Interface1. Ich habe seine Implementierung Imple implements Interface1 (alle Methoden wurden implementiert :)). JetztWenn ich eine Interface-Methode aufruft, holt sie den Methodenkörper von der Implementierungsklasse und führt sie aus?

, halten eine dritte Klasse CheckCall, kann ich einen Anruf in der Klasse CheckCall wie ich weiter unten erwähnt:

Interface1 interface1; 
interface1.method(); 

Alle notwendigen Importe durchgeführt wurden. Bitte sagen Sie mir, ist es möglich oder nicht, wenn nicht dann ok und wenn ja, dann sagen Sie mir, was passiert, wenn ich mehr als eine Implementierung Klassen für die gleiche Schnittstelle habe und ich mache den gleichen Anruf.

Antwort

14

Nun können Sie die Methode nicht direkt an der Schnittstelle aufrufen, aber Sie können tun, was Sie geschrieben haben, mehr oder weniger.

Sie schrieb:

Interface1 interface1; 
interface1.method(); 

Das funktioniert, wenn Sie dies tun:

Interface1 interface1 = new CheckCall(); 
interface1.method(); 

dann mir sagen, was passieren wird, wenn ich mehr als eine impl Klassen für haben die gleiche Schnittstelle und ich mache die gleichen Anruf

Nun, das ist das Schöne an Java:

http://en.wikipedia.org/wiki/Diamond_problem

Und es existiert nicht wirklich in Java, weil Java voll Mehrfachvererbung unterstützt: das Problem, das Sie sich beziehen sind, um die „Diamant-Problem“ bezeichnet , aber nur durch "multiple (Java) Schnittstelle Vererbung" (* siehe Kommentar).

Also in Ihrem Fall, wenn Sie interface1.method() anrufen, rufen Sie entweder Impl Methode oder CheckCall Methode und es ist keine Verwirrung möglich.

+0

In Bezug auf die Mehrfachvererbung, ** ** ANY OOA/OOD sauber in Java übersetzt werden kann, um OOP nur "Schnittstellenvererbung" verwenden. Verdammt, jeder OOA/OOD könnte trivialerweise in eine Sprache übersetzt werden, die nicht einmal das Konzept von * "Implementation Vererbung" * (auch bekannt als * "code reuse" *, was wirklich nicht viel mit OO zu tun hat) . Aber einige Leute verstehen nicht, dass Java MI vollständig unterstützt ... :( – SyntaxT3rr0r

+0

OK, also in welcher Weise unterscheidet sich Ihre Antwort von all den anderen Antworten, die Sie anscheinend abgelehnt haben? Weil ich den Unterschied nicht unterscheiden kann, abgesehen von der wiki link du fügst hinzu –

+0

@Sean Patrick Floyd: Leute können Antworten auf SO runterladen? – SyntaxT3rr0r

0

Nein, Sie müssen den Aufruf für das Objekt ausführen, das die Schnittstelle implementiert, nicht für die Schnittstelle selbst.

Bearbeiten: Eine Variable mit diesem Typ könnte verwendet werden, aber es müsste immer noch eine Klasse sein, die diesen Typ implementiert. Sie können keine Instanz einer Schnittstelle erstellen.

5

Ja, aber nicht wie du es geschrieben hast. Sie würden sagen:

Interface1 interface1 = new Imple(); 

Sie eine Variable vom Typ Schnittstelle erstellen, und es dann in die Klasse instanziiert, die die Schnittstelle implementiert. Sie sehen dies oft mit den Java-Sammlungen, zum Beispiel:

List<String> a = new ArrayList<String>(); 
0

Nr

Wie Sie keine Schnittstelle instanziieren können, werden Sie ein Imple Objekt erstellen müssen, wird es als ein verwenden, Interface1 man wie folgt aus:

Interface1 interface1 = new Imple(); 

interface1.method(); 

in der Tat, eine Schnittstelle Hauptinteresse kommen aus der Fähigkeit, ein Verfahren zu haben, jedes Objekt zurückgeben Umsetzung, ohne sich um gegebene Implementierung zu kümmern. In Ihrem Fall könnte es zeigt sich als

public class CheckCall { 
    public Interface1 factoryMethod() { 
     return new Imple(); 
    } 

    public void test() { 
     Interface1 used = factoryMethod(); 

     used.method(); 
    } 
} 
1

Eigentlich sollte man auf Methoden, die von den Schnittstellen beziehen, die sie definieren, aber Sie müssen eine tatsächliche Umsetzung der Klasse. So würde ich es in der Regel wie folgt aus:

// the variable is of type Interface1 
Interface1 interface1 = new Imple(); 
// but the method will be executed on the Imple object 
interface1.method(); 
7

Sicher, Ihr Code funktioniert gut! Sie müssen nur Ihre Variable interface1 mit einer tatsächlichen Implementierung initialisieren (d. H. New Impel()).

prüfen dieses Beispiel aus, ich Ihre Klasse-Namen verwendet:

public class CheckCall { 

    interface Interface1 { 
     void method(); 
    } 

    static class Imple implements Interface1 { 
     @Override 
     public void method() { 
      System.out.println("Imple.method1()"); 
     } 
    } 

    public static void main(String[] args) { 
     Interface1 interface1; 
     interface1 = new Imple(); 
     interface1.method(); 
    } 

} 
Verwandte Themen