2011-01-26 14 views
27

Java tutorial "Defining an Interface"'deJava öğreticisi paket özel bir arayüze sahip olabileceğimi söylüyor, ancak yapamıyorum

olduğunu belirtir. Arayüzün public olduğunu belirtmezseniz, arayüzünüz sadece arayüzle aynı pakette tanımlanan sınıflara erişebilir.

Ancak, bu

interface PPInterface { 
    void foo(); 
    void bar(); 
} 

class NewClass implements PPInterface { 
    void foo() {} 
    void bar() {} 
} 

NewClass'da derleyici hataları oluşturur; çünkü daha zayıf erişim ayrıcalıkları atamaya çalışıyorum; halka açıktı. Yani belgeler yanlış mı, yanlış bir şey mi yaptım yoksa belgeleri yanlış yorumlu muyum?

Sanırım bir arayüz kullanmam gerekmiyor - hoşuma gidiyor çünkü iyi organize edilmiş şeyler.

cevap

48

Bu, içerdiği yöntemlere değil, pakete özel olabilen arabirimin kendisidir. Yalnızca tanımlanmış olan paket içinde kullanılabilecek bir arabirim tanımlayabilirsiniz, ancak tüm arabirim yöntemleri gibi yöntemleri public şeklindedir. Bir sınıf bu arayüzü uygularsa, tanımladığı yöntemler public olmalıdır. Burada önemli olan, paketin dışında görünmeyen, tip arabirimidir. Dokümanlar yanlış değildir, çünkü arayüzde tanımlanan yöntemler, arayüzün kendisi ile aynı değildir. Ayrıca, bir arabirim tanımlanırken, bir yöntem tanımından önce public eklenmemesinin, yöntemlerin tümü örtük olarak public olduğu için hiçbir şey değişmediğini unutmayın.

Arabirimi uyguladığınız sınıf (lar) kendileri paket özel ise, public arabirim yöntemlerinin açıkçası bir sorun değildir. Tek kalıtım sorunu yoluna almazsa Ayrıca, tabii ki, yerine bir arayüz soyut bir sınıf kullanabilirsiniz:

abstract class Whatever { 
    abstract void foo(); 
    abstract void bar(); 
} 
Nitekim
+2

Ugh, yine Java'nın 'interface' http: // stackoverflow' unun erişim kısıtlama sınırlamaları nedeniyle soyut sınıflar ile uğraşmak zorunda kaldık.com/questions/5376970/protected-in-interface/5377300 # 5377300 – Pacerier

+0

"paketin dışında görünmeyen arabirim türü, yöntemler değil." Görünmez bir tipte kamu yöntemlerine nasıl erişebilirim? Hâlâ kamu yöntemlerinin amacının paket içinde ne olduğunu anlamıyorum - özel sınıf (veya arayüz ..). –

+0

@KorayTugay: Arayüz yöntemleri, pratik bir etkiye sahip olsun ya da olmasın her zaman 'public''dir. Ancak, örneğin, bazı genel arabirimleri uygulayan veya bazı genel türlerini genişleten bir paket özel türünüz varsa, ortak sınıftaki yöntemleri geçersiz kılan bu sınıftaki/arabirimdeki "genel" yöntemleri paketin dışından kullanılabilir. – ColinD

4

Ben zayıf erişim ayrıcalıkları Burada tartışılan NewClass içinde foo() ve bar() yöntemlerle içindir ediliyor ki (Bu konuda yanlış olabilir gerçi) düşünmek . Tüm arabirim yöntemleri örtülü olarak public'dur, ancak NewClass'da paket özel bıraktınız, bu da public'dan daha zayıf bir garantidir. NewClass değiştirilmesi

class NewClass implements PPInterface{ 
    public void foo() {} 
    public void bar() {} 
} 

muhtemelen bu çözecektir okumak.

+0

... ama bunu düzeltmek istemiyorum .. Onların paket özel olmasını istiyorum. Dokümanlar bunu yapabildiğinizi açıkça belirttiler, bu yüzden dokümanlar yanlış mı? Ya da sadece paket içindeki nesnelerin arayüzü uygulayabildiği anlamına mı geliyor, ancak yöntemler hâlâ halka açık mı? (Sanırım bu cevap) – Pete

+3

@ Pete- Burada iki ayrı sorun olduğunu düşünüyorum. Arabirim paketi özel bırakarak, arabirime başvuruda bulunabilen tek sınıflar aynı pakette olmalıdır. Ancak, bu arabirim tarafından tanımlanan yöntemler örtük olarak kamuya açıktır ve bu nedenle arabirimi uygulayan herhangi bir sınıfın, özel olarak işaretlenmiş belirli işlevlere de sahip olması gerekir. Yani hayır, dokümanlar yanlış değil - oyunda sadece iki ayrı görünürlük seviyesi var. – templatetypedef