2017-05-22 5 views
1

Typischerweise implementiert eine Klasse eine Schnittstelle, und die Klasse selbst oder seine Kindklasse die Methoden in der Schnittstelle zu überschreiben, wie:Java: Die untergeordnete Klasse implementiert die Schnittstelle, aber die übergeordnete Klasse überschreibt die Mitglieder der Schnittstelle.

eine Schnittstelle definieren:

interface Interface { 
    void fun(); 
} 

1.Parent Klasse überschreibt die Schnittstelle Verfahren und Kind seiner Klasse erben:

public class Parent implements Interface{ 
    public void fun(){ 
    } 
} 

public class Child extends Parent{ 
} 

Oder:

2. Elternklasse ist definiert als eine abstrakte Klasse und das Kind Klasse der Methoden in der Schnittstelle außer Kraft setzen:

public abstract class Parent implements Interface{ 
} 

public class Child extends Parent{ 
    public void fun(){ 
    } 
} 

Allerdings sehe ich auch eine seltsame Art und Weise die Interface-Methode außer Kraft zu setzen:

3.Die Kind Klasse nur Schnittstellen implementieren, sondern überschreiben Methoden in der Schnittstelle, die von der übergeordneten Klasse:

public class Parent{ 
    public void fun(){ 
    } 
} 

public class Child extends Parent implements Interface{ 
} 

der dritte Weg, um die Interface-Methode außer Kraft zu setzen ist, in dem Rahmen android Quellcode sehr häufig, zum Beispiel:

public interface ViewParent { 
    //...... 
    void requestLayout(); 
    ViewParent getParent(); 
} 

public class View implements Drawable.Callback, KeyEvent.Callback, AccessibilityEventSource { 
    //...... 
    @CallSuper 
    public void requestLayout() { 
     //...... 
    } 

    public final ViewParent getParent() { 
     return mParent; 
    } 
} 

public abstract class ViewGroup extends View implements ViewParent, ViewManager { 
    //...... 
} 

Verfahren requestLayout() und getParent() kommt aus ViewParent und Viewgroup implementiert ViewParent, aber warum ist die Implementierung des Verfahrens in der übergeordneten Klasse Ansicht getan werden?

Was ist der Grund für dieses Design?

+0

Aus welchem ​​Grund sollte es nicht erlaubt sein? – EJP

+0

Ihr 3. Punkt stimmt nicht mit dem Beispiel überein, das Sie angegeben haben (Parent implementiert im Android-Beispiel keine Schnittstelle und das ist völlig normal) Korrigieren Sie Ihre Frage. –

+0

@pulp_fiction Der Kern der Frage ist: Unterklasse implementiert eine Schnittstelle, aber die Super-Klasse überschreiben Methoden der Schnittstelle. Im Beispiel liegt der Fokus auf der Beziehung zwischen ViewParent, View und ViewGroup. Diese relative Beziehung stimmt mit dem dritten Entwurfsmuster überein. – StrayedKing

Antwort

0

Nun hat jeder View ein Elternteil View, so dass die Basis View Klasse braucht eine getParent() Methode und hat eine mParent Eigenschaft.

View implementiert jedoch nicht ViewParent, da nicht alle Ansichten Eltern anderer Ansichten sind.

Wenn View wurde einige grundlegende „ViewInterface“ Umsetzung, wäre es möglich, getParent() in dieser Schnittstelle zu schließen, aber da es nicht der Fall ist, getParent() wurde in der ViewParent Schnittstelle enthalten.

Und seit View implementiert bereits diese Methode, die ViewGroup Unterklasse muss es nicht implementieren.

+0

Ihre Antwort ist um das Beispiel, das er gepostet hat. Die eigentliche Frage ist, warum ein Muster wie "Parent implementiert Interface" und "Basis erweitert Parent implementiert Interface" akzeptabel ist? Dies ist auch in Standard-Java-APIs zu finden –

Verwandte Themen