java - 为什么接口的方法的访问修饰符只能是public不能是protected?
PHP中文网
PHP中文网 2017-04-17 17:32:01
0
5
975

为什么抽象类的方法的访问修饰符可以是public和protected,而接口的方法的访问修饰符只能是public?

或者说,

接口的方法的访问修饰符为什么不能是protected?

PHP中文网
PHP中文网

认证0级讲师

全部回覆(5)
PHPzhong

個人推測:

  • 語言的設計者可能覺得這增加了interface的access model的複雜度。

  • 負責實現介面的class的會很為難,如果implementation和interface不在一個package下面,你該不該implement一個protected method呢?

下面我用2個實例說明,第一個讓你覺得protected interface method不太make sense。另一個讓你覺得,它就完全不make sense。

比如說,在sample.interface这个包下面有一个ISomething

package sample.interface;
interface ISomething {
  protected foo1() { ... }
}

下面的case就怪怪的。

package a.place.of.nowhere;
// some code tries to use ISomething
ISomething someting = initializeSomething();

something.foo1();   // 抱歉,foo1是被保护的,和你不是一个package的,你滚吧。
// ME: shit... if I cannot use anything of this interface, why the heck you expose this interface to me...

更不make sense的:

package a.place.of.nowhere;
// some code tries to implements ISomething
class SomethingImpl implements ISomething {
   // 抱歉,尽管你想implement foo1这个接口方法,但是由于你在a.place.of.nowhere这个package,foo1()对你是不可见的。走人吧。
   protected void foo1() {...}

如此一來,class implement和interface就要在一個package下面。這是什麼鬼啊,我可能要實現多個interface,又不能分身。 。 。

阿神

介面更多的是在系統架構設計方法發揮作用,主要用於定義模組之間的通訊契約。
而抽象類別在程式碼實作方面發揮作用,主要用於實作程式碼的重用。

小葫芦

Abstract 和interface 用的場合不一樣,前者在繼承參數的前提下override,但目標都是它的直接或間接父類,protected權限是可以的。而interface通常用於不同類別中的回調,例如listener,如果是protected 權限那麼即便得到listener 實例也無法獲得它的方法,那麼回調本身也就沒有了意義。
一點個人見解,如有錯誤請指出

迷茫

介面是什麼?介面寫作interface,是給外界互動用的,你寫成protected還怎麼跟外界互動?

介面用來規約,傳入的某個物件必須實作某些方法,如果實作的方法不可調用,那麼這個規約還有啥意義?反正也調用不到,穿啥對像不都一樣嘛。

Peter_Zhu

介面是用來實現的,是外人,不是繼承關係的,不是直系親屬,如果currency money=1^n,不能給他一份錢,他也享受不到。
protect對於繼承的子類別可見,是自己人, money就都繼承給他吧。
如果介面搞成protect, 那不是二奶就是小三,非法的。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板