2012-01-28 37 views
19

Powiel możliwe:
Protected in InterfacesDlaczego Interfejs nie może być chronione metody

W Javie Dlaczego nie mam chronione metody w interfejsie?

Ponieważ zgodnie ze specyfikacją Java

Protected Access (oznaczone słowem kluczowym zabezpieczony) - pole lub metoda dostępna dla każdego rodzaju w tym samym opakowaniu, a do podklasy w każdym pakiecie.

Jeśli w ogóle muszę korzystać z interfejsu, zamierzam go zaimplementować i zastąpić metody. Więc jeśli zamierzam wdrożyć, gdy klasa ma dostęp do tych metod, ponieważ metoda dostępna w każdym pakiecie. Więc jaka szkoda w deklarowaniu metody jako chronionej w interfejsie?

+4

bardzo dobre pytanie. Dla prawie każdej innej rzeczy na Jawie znalazłem prawdziwy powód dokonanych wyborów, ale tego nie zrobiłem. Sensowne jest dla mnie zdefiniowanie metody chronionej w interfejsie, która pozwala innej klasie w tym samym pakiecie na użycie tej metody na obiekcie implementującym bez konieczności ujawniania tej metody, która może nie być przeznaczona do wywoływania przez kogokolwiek innego niż członków paczki do reszty świata. –

+0

@MarkusA., +1, zobacz także http://stackoverflow.com/questions/5376970/protected-in-interfaces#comment-39795200 – Pacerier

Odpowiedz

11

Metody chronione są przeznaczone do dzielenia implementacji z podklasami. Interfejsy nie mają nic do zaoferowania, jeśli chodzi o dzielenie się wdrażaniem, ponieważ nie mają one żadnej implementacji. Dlatego wszystkie metody na interfejsach muszą być publiczne.

+24

Chociaż rozumiem twój punkt tutaj, czy metoda "publiczna" w interfejsie nie zmusza klasy implementującej do dzielenia się tą metodą z resztą świata? Jeśli interfejs jest wykorzystywany w celu uczynienia elementów interfejsu API bardziej modułowymi, nie oznacza to, że programista chce nagle ujawnić swoje elementy wewnętrzne reszcie świata. Dzięki temu ograniczeniu metoda, która ma implementację i ma być "chroniona pakietowo" (domyślnie), musi zostać "publiczna" ze względu na "interfejs", który spełnia. Więc chociaż ma sens dla 'chronionych', nie wydaje się to dla' default' – jbx

+1

@jbx Masz rację - interfejsy pakietowo-prywatne tworzą interesujący problem. Jednak myślę, że można go rozwiązać na poziomie kompilatora, zezwalając na prywatne i pakietowe metody dostarczania implementacji interfejsów pakiet-prywatny. – dasblinkenlight

+1

Właściwie uważam, że sam interfejs może być pakietem prywatnym, więc w rzeczywistości to, co robi to ograniczenie, wymusza podejście wszystko albo nic. Nie możesz mieć połowy metod "public", a połowa z nich jest chroniona pakietowo. Możesz zobaczyć "interfejs" ze wszystkimi jego metodami lub nie możesz tego zrobić. Może to przecież wszyscy wszechpotężni twórcy chcieli :). W każdym razie stanowi to powyższy problem. Klasa 'public' implementująca chroniony pakiet' '' będzie zmuszona do stosowania metod implementujących interfejs 'public'. – jbx

-1

Nieważne, czy wystąpiło uszkodzenie, czy nie. Twój punkt jest dyskusyjny, jeśli kompilator na to nie pozwoli. Projektanci języka postanowili wymagać, aby wszystkie były publicznie dostępne i nie byłoby możliwości ich zmiany teraz bez łamania wielu kodów.

+0

Przedstawiłeś punkt. Mogło być inaczej. W pewnym sensie mechanizm przyjaźni jest bliski posiadania metod chronionych w interfejsach, jest sposobem na zdefiniowanie kontraktów, ale także sposób na ograniczenie liczby osób, które mogą polegać na umowie. Ale w Javie interfejsy zostały zaprojektowane tak, aby zezwalały tylko na publiczne metody i do tej pory nie ma na to żadnych ograniczeń. Społeczność programistów java zawsze znajdowała obejścia tej sytuacji, a java pozwala osiągnąć jedne z największych rzeczy, które mogliśmy osiągnąć. w IT, głównie dlatego, że zapewnia czysty sposób tworzenia programów. – Snicolas

+2

Coulda, willa, shoulda - a więc świat idzie. Nie napisałem jeszcze doskonałego oprogramowania. I nie uważam tego za fatalną wadę w tym języku. Nie zgadzam się, że to w ogóle wielka sprawa. – duffymo

+1

Właściwie, uważam za bardzo interesujące pytanie, jaka szkoda byłaby.Prawie wszystkie inne decyzje podejmowane przez projektantów Javy znalazłem powód, który ma logiczny sens. Nawet skomplikowane rzeczy, takie jak http://stackoverflow.com/questions/197190/why-cant-i-use-a-pepe-argument-in-a-type-parametr-with-multiple-bounds (patrz punkt 2 w drugim odpowiedź). Nie dla tego. –

5

Interfejs obiektu jest częścią tego obiektu widoczną dla użytkowników zewnętrznych tej klasy. Przeciwnie, chronione i prywatne metody (i pola) należą do klasy wewnętrznej. Są one zamknięte wewnątrz klasy i użytkownik klasy nie powinien ich znać.

Więc, od interface jest używany do definiowania interfejsów (gra słów nie przeznaczonych), rozsądne jest, że nie zawierają one metod chronionych.

Jeden nie chce myśleć o realizacji przy definiowaniu interface

Powiązane problemy