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() {...}
個人推測:
語言的設計者可能覺得這增加了interface的access model的複雜度。
負責實現介面的class的會很為難,如果implementation和interface不在一個package下面,你該不該implement一個protected method呢?
下面我用2個實例說明,第一個讓你覺得protected interface method不太make sense。另一個讓你覺得,它就完全不make sense。
比如說,在
sample.interface
这个包下面有一个ISomething
。下面的case就怪怪的。
更不make sense的:
如此一來,class implement和interface就要在一個package下面。這是什麼鬼啊,我可能要實現多個interface,又不能分身。 。 。
介面更多的是在系統架構設計方法發揮作用,主要用於定義模組之間的通訊契約。
而抽象類別在程式碼實作方面發揮作用,主要用於實作程式碼的重用。
Abstract 和interface 用的場合不一樣,前者在繼承參數的前提下override,但目標都是它的直接或間接父類,protected權限是可以的。而interface通常用於不同類別中的回調,例如listener,如果是protected 權限那麼即便得到listener 實例也無法獲得它的方法,那麼回調本身也就沒有了意義。
一點個人見解,如有錯誤請指出
介面是什麼?介面寫作interface,是給外界互動用的,你寫成protected還怎麼跟外界互動?
介面用來規約,傳入的某個物件必須實作某些方法,如果實作的方法不可調用,那麼這個規約還有啥意義?反正也調用不到,穿啥對像不都一樣嘛。
介面是用來實現的,是外人,不是繼承關係的,不是直系親屬,如果currency money=1^n,不能給他一份錢,他也享受不到。
protect對於繼承的子類別可見,是自己人, money就都繼承給他吧。
如果介面搞成protect, 那不是二奶就是小三,非法的。