2016-04-05 103 views
0

我有一個接口和2個實現此接口的類。以下面的代碼爲例。接口中的受保護方法

addAchievedMilestone是一種需要在每個類中實現的方法,但只能由同一個包中的類執行。

爲什麼addAchievedMilestone方法不能被保護?

我希望它被保護,因此它只能被相同包中的類使用。 (該方法不會被任何其他類擴展)

但是Project-class中的修飾符總是需要公開的,我該如何解決這個問題?

示例代碼:

package Base; 

public interface MilestoneAchievable { 

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

項目類:

package Base; 
public class Project implements MilestoneAchievable{ 

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

沒有實施MilestoneAchievable界面 – zeugor

+0

忘記了,現在是:) – Programmer1994

回答

2

在接口中聲明的任何方法是公開的。 而子類不能減少方法的可見性/訪問。 有關詳細信息,請參閱Why can't you reduce the visibility of a method in a Java subclass?

+0

項目沒有子類。受保護僅用於實現只有同一個包中的類才能執行該方法。 – Programmer1994

+1

Yogesh_D說的是'Project' *是一個子類。它是「MilestoneAchievable」的一個子類,並且它不能減少公衆對私人包裝的可視性。正如你可以在[本表](http://stackoverflow.com/a/33627846/276052)中看到的那樣,確實會降低可視性。 – aioobe

1

只是不要讓你的界面公共

或者說做2個接口:

在你的代碼項目的A類公衆一個

public interface MilestoneAchievable { 
    public Milestone getMaxMilestone(); 
} 

包一個

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

我得到一個錯誤,實施的addAchievedMilestone方法的修飾符需要公開... – Programmer1994

+0

我沒有它^^可能是我們的java版本中的差異?順便說一下,把它公開並不會改變任何事情:你的界面仍然是封裝受限的:) –