2011-07-03 66 views
0

1) OnCreate是ClsLast類的實例化對象的公共方法。 但我想限制OnCreate方法作爲保護面向對象有關接口,抽象類和具體類的問題

interface InterFace { 
    void OnCreate(); 
} 

class ClsFirst implements InterFace { 
    @Override 
    public void OnCreate() { } 

} 

class ClsLast extends ClsFirst{ } 

class Test { 
    static void main(){ 
     ClsLast objClsAct = new ClsLast(); 
     objClsAct.OnCreate(); 
    } 
} 

2)如果我設置onCreate方法在接口保護

interface InterFace { 
    protected void OnCreate(); 
} 

我得到的錯誤是這樣的: Illegal modifier for the interface method OnCreate; only public & abstract are permitted

3)如果我設置保護在ClsFirst類中實現InterFace的方法如下:

interface InterFace { 
    void OnCreate(); 
} 

class ClsFirst implements InterFace { 
    @Override 
    protected void OnCreate() { } 

} 

我得到這個錯誤: Cannot reduce the visibility of the inherited method from InterFace

4)當我改變ClsFirst爲抽象類和實現接口

interface InterFace { 
    void OnCreate(); 
} 

abstract class ClsFirst implements InterFace { 

} 

我還沒有實現的OnCreate裏面的方法ClsFirst類但ClsLast爲什麼?

摘要

  1. 我怎樣才能設置接口方法只能在派生類中使用?
  2. 爲什麼我不能在Interface中設置受保護訪問的方法?
  3. 爲什麼在實現InterFace後,我不能設置不同於公共類的訪問器類型?
  4. 抽象類,即使它們實現了接口,也不必自己添加未實現的方法,直到一個類派生抽象類爲止。爲什麼?

非常感謝你從現在開始給我們的答覆。

+0

你能解釋一下你認爲在哪種情況下實現一個接口,但只限制派生類的訪問會有意義嗎?如果只有派生類可以看到一個方法,爲什麼你需要一個接口? – dtb

+0

我想創建接口,並從創建類結構開始部署一些規則。但是,當我試圖做到這一點時,我遇到了其他問題。我想,在你的答案中,可能有關於面向對象和所有人的關於面向對象的良好信息。但是我的第一個願望是使用接口和抽象類來制定規則和創建良好的類結構。 – uzay95

+0

OOP的一點是,開發人員可以自由設計他認爲合適的類的非公共部分。您只能將規則放在類結構的公共部分。 – dtb

回答

2

一種interface是每一個定義public contract。通過實現一個接口,您承諾提供一組方法(以及其他語言的屬性)。

的接口沒有任何共同之處與abstract類,因爲只要你想上一個類可以實現多個接口,你implement而不是從它derive

一個abstract class是一個基類,其等,其用於共享不同類之間實現細節並提供了合同,太一個部分功能基。但它更多是所有派生類的內部合約。大多數時候抽象類用於強制所有派生類成爲共同模式,而不是共享公共契約。

抽象類可以強制派生類實現方法(或使用關鍵字virtual提供合適的默認實現)並使用此方法(稱爲Template Pattern)。

如果你在一個抽象類實現一個接口,你就必須提供所有的接口方法,因爲抽象類不能被實例化。但是,如果你沒有實現所有的接口方法,你的層次結構中的第一個非抽象類必須提供缺少的方法。

2

接口方法總是公開的。你不能縮小這些方法的範圍。在抽象類中使用受保護的抽象方法。

0

其實你可以隱藏方法,直到你的具體類被明確地實現接口鑄造一個「接口」實例:

abstract class ClsFirst : Interface 
{ 
    void Interface.OnCreate() 
    { 
      this.OnCreate(); 
    } 

    protected abstract void OnCreate(); 
} 

ClsFirst last = new ClsLast(); 
last.OnCreate(); // Compiler Error, since OnCreate() is protected 
Interface lastAsInterface = last; 
lastAsInterface.OnCreate(); // Works, and calls the abstract OnCreate() method. 
+0

在java中:'interface InterFace {void OnCreate(); } 抽象類ClsFirst實現了InterFace protected abstract void OnCreate(); }生成此錯誤:'不能減少從InterFace繼承的方法的可見性,並且我不能在抽象類中實現'void InterFace.OnCreate()'方法。 – uzay95

+0

但在C#中,您的響應正在工作,沒有發生任何錯誤。 – uzay95

+0

對不起,我被標籤「C#」拋出。看起來Java確實支持顯式接口,但是在抽象類中實現它們是一個問題。 –

1
  1. 你不能做到這一點。如果你有一個只實現了接口契約中定義的一部分的中間類,你可以將方法設置爲虛擬或抽象。

  2. 你也無法做到這一點,理由很簡單,接口定義了一個合同,實現請求有一組操作。你可以在你的抽象類中明確地實現接口,或者將整個接口限制爲「內部」,至少在c#中,如果你想保持內部的話。

  3. 你不能這樣做,因爲你答應實現一個接口。

  4. 因爲一旦你標記類作爲一個抽象的,你間接地指出另一件事是,你不能實例化。因此,您將實現接口的要求傳遞給可以創建實例的第一個類(我的意思是繼承鏈)。

ad1。 (c#example1)

+0

謝謝你的4個答案。現在我試圖理解並逐個測試它們。我無法在中產階級中設置受保護的方法。你會舉例說明你的第一個答案。 – uzay95

0

1)爲什麼要實現一個受保護的interface開始?它不會增加任何價值。你已經有一個辦法,以確保所有派生類符合給定的合同:

protected abstract void OnCreate(); 

2)接口定義public合同。通過public我的意思是它具有與界面本身相同的可訪問性。這就是爲什麼定義interface成員時不允許使用訪問修飾符的原因。

3)您不能減少任何虛擬成員或接口成員的無障礙環境,你會打破了接口的合同。在你的例子中((IOnCreate)ClsFirst).OnCreate()將不可能,因爲OnCreate()不可訪問,這將意味着ClsFirst不實現IOnCreate接口。