Klasa a interface

0

Witam...

jestem nowy w programowaniu w javie i mam takie proste (dla was) pytanie... czy ktos moglby mi jakos konkretnie i w latwy sposob wyjasnic czym sie rozni klasa od interfaceu oraz interface od klasy abstrakcyjnej? ja wiem tyle ze jedna klasa moze dzidziczyc jedna klase ale za to moze implementowac wiele intefaceow... kiedy powinno sie czego uzywac (jesli chodzi o klasy i klasy abstrakcyjne to mniej wiecej wiem gorzej z interfejsami)

z gory dzieki za odpowiedz

0

Klasy abstrakcyjne, to takie klasy, których nie można utworzyć żadnego odpowiednika (obiektu danej klasy). Stosuje się je głównie po to, aby zadeklarować pewien wspólny interfejs (zestaw metod - np. metoda jedź dla Klasy Pojazd - wszystkie Pojazdy mają metodę jedź - lecz każdy z nich powinien mieć swoją) dla klas potomnych.
Klasy dziedziczące po klasie abstrakcyjnej powinny przesłonić wszystkie jej abstrakcyjne metody - w innym wypadku klasa dziedzicząca również musi być klasą abstrakcyjną.
Metody abstrakcyjne, to takie metody, które nie posiadają ciała - deklarujemy jedynie nagłówek metody, na potrzeby dziedziczenia - klasy potomne przesłaniają daną metodę i deklarują jej ciało.

Jak wiesz zwykłe klasy mogą dziedziczyć po jednej innej klasie bazowej - jest to głównie spowodowane ograniczeniem pewnych niejasności, które mogą zostać dziedziczeniem wielokrotnym spowodowane.
Nie jest to jednak ułomność Javy - do tego służą nam interfejsy. Interfejsy to nic innego jak klasy w 100% abstrakcyjne - czyli nie mogą posiadać innych metod niż metody abstrakcyjne, a oprócz tego implementując jakiś interfejs jesteś zmuszony przesłonić wszystkie jego metody.

0

Ja tylko jeszcze dodam, ze interfejsy i miedzy innymi klasy abstrakcyjne uzywa sie po to, by oddzielic implementacje od abstrakcji. Na przyklad: chcac uzywac Pojemnika interesuje cie tylko to, co ten pojemnik potrafi, a nie jak to robi. To co potrafi zapisane jest wiec w interfejsie, z ktorego dziedzicza jakies pojemniki. Wykorzystujesz jeden z tych pojemnikow, ale powiedzmy, ze miesiac pozniej uznajesz, ze inny jest lepszy do tego zastosowania. Wystarczy wiec podmienic pojemnik, a reszta kodu zostaje taka sama, bo przeciez wszystkie implementuja metody interfejsu. Co wiecej mozesz uzywac rzutowania na interfejs niekoniecznie pamietajac z jakim akurat pojemnikiem masz do czynienia. Wazne tylko, by ten pojemnik przeslanial/implementowal metody interfejsu.

pozdrawiam
johny

0

No ja tez mam problem z zastosowaniem interface..przeciez i tak musze w kazdej klasie zaimplementowac metody zawarte w interface wiec tak na prawde po kiego to? zeby tylko pokazac jakie parametry przyjmuje i co zwraca metoda? ..przeciez jak mam klasy jakies np class1, class2 itd i w nich metody ruch to w kazdej klasie inaczej implementuje metode ruch i wywoluje na rzecz daneg obiektu class1.ruch class2.ruch.....wiec po co tu jakis interface? kiedy w ogóle to jest przydatne? bo te opisy przedmowcow sa jak belkot z jakies "madrej" ksiazki..moze jakis krotki przyklad,opis?

0
prohol napisał(a)

No ja tez mam problem z zastosowaniem interface..przeciez i tak musze w kazdej klasie zaimplementowac metody zawarte w interface wiec tak na prawde po kiego to? zeby tylko pokazac jakie parametry przyjmuje i co zwraca metoda? ..przeciez jak mam klasy jakies np class1, class2 itd i w nich metody ruch to w kazdej klasie inaczej implementuje metode ruch i wywoluje na rzecz daneg obiektu class1.ruch class2.ruch.....wiec po co tu jakis interface? kiedy w ogóle to jest przydatne? bo te opisy przedmowcow sa jak belkot z jakies "madrej" ksiazki..moze jakis krotki przyklad,opis?

Dzieki za podsumowanie... pisalem z glowy :/

Podalem przyklad, no ale jeszcze raz:

Jest program, w ktorym na ekranie pokazuja sie figury. I te figury sie jakos tam ruszaja, na kilka roznych sposobow. Pytanie jak nimi sterowac? Otoz mozna stworzyc klase Dyrektor, ktora co np. 30ms wywoluje wyliczenie nowych wspolrzednych. ALE nie ma sensu tworzyc tablic obiektow na kazdy rodzaj osobno. Czyli mamy klasy: Podskakiwacz, Przelatywacz, Sprezynka, i tym podobne. I robimy sobie interfejs np. Ruch, ktory ma metode wylicz_nowe_wspolrzedne, i ktory implementuja wszystkie te poruszajace sie klasy. Tworzymy wiec JEDNA tablice typu Ruch i do niej wrzucamy wszystkie obiekty, nastepnie w petli wywolujemy metode. Mozna tak, dzieki temu, ze metoda jest zadeklarowana w interfejsie, a dzieki polimorfizmowi wywolaja sie odpowiednie metody konkretnego obiektu. Duzo latwiej?

pozdrawiam
johny

0

Interfejsy są bardzo użyteczne w momentach, gdy 2 klasy muszą ze sobą współpracować w 2 kierunkach, tzn 1 klasa może wywoływać metdy 2 i odwrotnie. Najczęściej spotykanym interfejsem jest ActionListener, dzięki któremu obsługujemy akcje. W kodzie piszemy np. MojaForma extends JFrame implements ActionListener. Taki zapis pozwala nam wykonać metodę addActionListener dla przycisku (JButton) z parametrem this wskazującym na naszego frame'a. Parametrem metody addActionListener jest obiekt, który implementuje interfejs ActionListener.

Dzięki interfejsom w prosty sposób można łączyć silnik np. gry z interfejsem użytkownika. Definiujemy odpowiedni interfejs z metodami pokazKomunikat(String komunikat), pokazBlad(String blad), zmienStatus(String status) itp. W silniku definiujemy obiekt np. guiHandler, który implementuje nasz interfejs. Jeśli silnik będzie chciał wywołać komunikat to użyje guiHandlera i jego metody pokazKomunikat(String komunikat). Teraz możemy napisać frame'a dla naszej gry. Oczywiście musi implementować nasz interfejs. Jak interfejs GUI będzie zrobiony wystarczy do silnika dodać Frame'a setGuiHandler i wszystko śmiga ;).

0

dzieki za wytlumaczenia..juz mi sie rozjasnilo troche:)

1 użytkowników online, w tym zalogowanych: 0, gości: 1