2016-05-23 15 views
0

Shape.javaAbstrakte Klasse oder öffentliche Methode mit Schnittstelle

public interface Shape { 
    String draw(); 

    void calcSomething(); 
} 

Square.java

public class Square implements Shape { 
    @Override 
    public String draw() { 
     return "SQUARE"; 
    } 

    @Override 
    public void calcSomething() { 

    } 
} 

Wenn ich ein interface implementieren, die Methode, die ich muss public sein umgesetzt.

Ich möchte draw() public method aber calcSomething()privat oder geschützt machen.

Ich bin durch Interfaces in Java: cannot make implemented methods protected or private gegangen. Und es nicht gerade Weg, um diese

Anstatt also zu tun Schnittstelle verwenden Ich plane abstrakte Klasse

Shape.java mit abstrakten Klasse

public abstract class Shape { 
    abstract public String draw(); 

    abstract protected void calcSomething(); 
} 

Square.java zu verwenden, die Shape implementiert abstrakte Klasse

public class Square extends Shape { 
    @Override 
    public String draw() { 
     return "SQUARE"; 
    } 

    @Override 
    protected void calcSomething() { 

    } 
} 

Welches sollte ich wählen. Sollte ich Schnittstelle und machen den calcSomething()öffentlichen oder sollte ich verwenden abstrakte Klasse und machen die calcSomething()geschützt

+0

Meinung: Ich würde die zweite verwenden, um die Formkoordinaten selbst in einer 'List' oder ähnlichem speichern zu können.Eine abstrakte Klasse würde jedoch nur Sinn ergeben, wenn Sie Informationen für diese 'Shape' speichern wollen, während Sie für die erbenden Klassen Platz für 'abstrakte' Implementierungen lassen. Wenn ich als Seitenknoten die Methode 'draw' lesen würde, würde ich eher erwarten, dass sie etwas zeichnet, anstatt nur eine' String' zurück zu geben. Ich könnte erwägen, diese Methode umzubenennen, um darzustellen, was sie wirklich macht. – SomeJavaGuy

+0

Warum ist 'calcSomething' privat, wenn es in der Schnittstelle ist? –

+0

Ich habe eine andere Klasse, die Shape implementiert. Alle verwenden denselben Methodennamen, um etwas zu berechnen. Ich wollte diese Methode nur an der Schnittstelle hinzufügen. @ ReutSharabani. Ich könnte falsch liegen, so zu denken. Bitte korrigieren Sie mich, wenn ich falsch liege –

Antwort

2

The Java™ Tutorials - What Is an Interface? Zitiert:

eine Schnittstelle Implementierung ermöglicht eine Klasse mehr werden formal über die Verhalten verspricht es zu bieten. Schnittstellen bilden einen Vertrag zwischen der Klasse und der Außenwelt.

Damit die Außenwelt auf die Methoden zugreifen kann, müssen sie öffentlich sein.

Wenn die Methode nicht öffentlich, d. H. Von der Außenwelt aufrufbar sein soll, gehört sie nicht in die Schnittstelle.

Wenn Sie wollen calcSomething() von anderen Code in Shape aufrufbar sein, dann ... Hoppla, gibt es keinen anderen Code in Shape. Es ist eine Schnittstelle.
Ok, wenn Sie wollen, dass calcSomething() von anderen Code in Square aufrufbar ist, benötigen Sie es eine abstrakte (oder Stub) -Methode. Dies ist zum Beispiel, wie die template method pattern funktioniert.

Verwandte Themen