2016-04-05 10 views
0

Ich habe eine Schnittstelle und 2 Klassen, die diese Schnittstelle implementieren. Siehe den folgenden Code als Beispiel.Geschützte Methode in der Schnittstelle

addAchievedMilestone ist eine Methode, die in jeder Klasse implementiert werden muss, aber nur von einer Klasse im selben Paket ausgeführt werden kann.

Warum kann die Methode addAchievedMilestone nicht geschützt werden?

Ich möchte es geschützt werden, so dass es nur von Klassen in dem gleichen Paket verwendet werden kann. (Die Methode wird von keiner anderen Klasse erweitert)

Aber der Modifikator in der Projektklasse muss immer öffentlich sein, wie kann ich das lösen?

Beispielcode:

package Base; 

public interface MilestoneAchievable { 

    public Milestone getMaxMilestone(); 
    void addAchievedMilestone(Milestone m) throws Exception; 
} 

Projektklasse:

package Base; 
public class Project implements MilestoneAchievable{ 

    public Milestone getMaxMilestone() { 
     //implementation goes here 
    } 
    public void addAchievedMilestone(Milestone m) throws Exception 
    { 
    //implementation goes here 
    } 
} 
+0

im Code der Projektklasse implementiert nicht MilestoneAchievable Schnittstelle – zeugor

+0

vergessen, jetzt ist es :) – Programmer1994

Antwort

2

Jede in einer Schnittstelle deklariert Methode ist öffentlich. Und Unterklassen können Sichtbarkeit/Zugriff einer Methode nicht reduzieren. Weitere Informationen finden Sie unter Why can't you reduce the visibility of a method in a Java subclass? .

+0

Projekt hat keine Unterklasse. Geschützt wird nur verwendet, um zu erreichen, dass nur Klassen im selben Paket die Methode ausführen können. – Programmer1994

+1

Was Yogesh_D sagt ist, dass 'Project' * * eine Unterklasse ist. Es ist eine Unterklasse von "MilestoneAchievable" und kann die Sichtbarkeit von öffentlich auf privat nicht reduzieren. Wie Sie in [dieser Tabelle] (http://stackoverflow.com/a/33627846/276052) sehen können, wäre es in der Tat eine Verringerung der Sichtbarkeit. – aioobe

1

machen einfach nicht Ihre Schnittstelle öffentlich

bzw. 2-Schnittstellen tun:

Ein öffentliches

public interface MilestoneAchievable { 
    public Milestone getMaxMilestone(); 
} 

ein Paket ein

interface MilestoneAchievableProt extends MilestoneAchievable { 
    void addAchievedMilestone(Milestone m) throws Exception; 
} 
+0

Ich bekomme einen Fehler, dass der Modifikator der implementierten addAchievedMilestone-Methode öffentlich sein muss ... – Programmer1994

+0

Ich habe es nicht ^^ könnte du zu einem Unterschied in unserer Java-Version sein? By the way, es öffentlich zu machen wird nichts ändern: Ihre Schnittstelle wird weiterhin Paket eingeschränkt sein :) –