Interfejs a konstruktor

2013-07-09 23:32

Rejestracja: 7 lat temu

Ostatnio: 1 miesiąc temu

0

Hej

Ostatni czytam o dziedziczeniu i interfejsie w javie. Czy przy interfejsie da się uzyskać coś takiego jak przy dziedziczeniu gdzie np. operacja matematyczna jest wykonywana w nad klasie a do podklasy/dziedziczącej dodaje tylko zmienną przy założeniu, że konstruktor będzie w interfejsie?
Tego zagadnienia do końca nie rozumiem, gdyż ja to widzę tak, że w interfejsie piszę jakiś konstruktor i ten konstruktor implementuje sobie do odpowiednich klas. Tylko, że nie che mi to tak działać.

I jeszcze jedna kwestia - widzę, że jeżeli w konstruktorze umieszczę metodą z klasy A to mogę ją sobie potem implementować do innych klas. Ale skąd ten interfejs wie z jakiej klasy ma pobierać metodę? Już kompletnie wszystko mi się pomieszał, czy on przeszukuje wszystkie klasy w folderze w poszukiwaniu nazwy tej konkretnej metody?

edytowany 2x, ostatnio: rubesom, 2013-07-09 23:33

Pozostało 580 znaków

__tmp
2013-07-09 23:39
__tmp
0

Interfejs + konstruktor? Cos tu brzydko pachnie...

Interfejs jest tylko takim szablonem jakich metod mozna uzywac na zewnatrz, dlatego wszystkie one sa niejawnie public. Co wiecej w klasach anonimowych/wewnetrznych interfejsy maja ciut glebsze znaczenie, ale juz nie bede Ci mieszal w glowie.
Interfejs w Javie z tego co pamietam, nie moze posiadac normalnych danych, wszystkie sa one automatycznie static final, wiec jest to ciut bez sensu.
http://pl.wikipedia.org/wiki/[...]%28programowanie_obiektowe%29

Jesli chodzi o to, ze jvm (chyba?) wie, ktora metode ma wywolac, to jest to tak zwany late binding(pozne wiazanie), a calosc z tym zwiazana jest okreslana mianem polimorfizmu. Polega to na tym, ze metoda ktora ma zostac wywolana nie jest okreslona az do momentu uruchomienia.
W Javie istnieje tylko pozne wiazanie, poza przypadkami metod final.
http://pl.wikipedia.org/wiki/Polimorfizm_%28informatyka%29

Pozostało 580 znaków

2013-07-10 00:58

Rejestracja: 9 lat temu

Ostatnio: 4 lata temu

2

interfejs definiuje tylko sposób komunikowania się z klasą (interfejs) mówiąc jakie mają być zdefiniowane funkcje dostępu, ale dając pełną dowolność przy implementacji
jeżeli chcesz utworzyć konstruktor to tworzysz klasę abstrakcyjną po której dziedziczysz
dziedziczyć można tylko po jednej klasie, konstruktor też można mieć tylko jeden, a interfejsów wiele


Pół giga extra na dropboxie? Pół giga extra na dropboxie! Tyle wygrać! >>Klik here<<
Dlaczego konstruktor mozna miec tylko jeden? Bo ja np. tutaj widze po 2 dla kazdej klasy z wyjatkiem Main -> http://ideone.com/OvQn0m - n0name_l 2013-07-10 02:14
w sensie jeden który się wywoła - unikalna_nazwa 2013-07-10 02:19
@unikalna_nazwa, napisz jasno o co Ci chodzi w zdaniu: konstruktor też można mieć tylko jeden. Rozumiane dosłownie jest nieprawdziwe, wyjaśnienie powyżej jest natomiast bardzo tajemnicze. - bogdans 2013-07-10 07:05
@bogdans - jemu chodzi tylko o to, że klasa może mieć dowolną ilość przeciążonych konstruktorów, natomiast obiekt tworzy się na podstawie jednego z nich - allocer 2013-07-10 12:09
Sprecyzujmy, ze klient klasy korzysta z jednego konstruktora jawnie do tworzenia obiektu. Tak naprawde za jednym zamachem moga byc wszystkie wywolane. http://ideone.com/zrH3Nh - n0name_l 2013-07-10 12:37

Pozostało 580 znaków

2013-07-10 12:01

Rejestracja: 7 lat temu

Ostatnio: 1 miesiąc temu

0

To może rozpiszę bardziej o co mi chodzi:
Korzystam m.in. z kursu http://javastart.pl/ i tam w jednej z lekcji jest mowa o "obiektowości".
Kod:

public class Punkt{
    int wspX;
    int wspY;
}

i drugi:

public class UstawPunkt{
    public static void main(String args[]){
        Punkt punkt = new Punkt();
        punkt.wspX = 10;
        punkt.wspY = 20;
        System.out.println("Współrzędne punktu to ("+punkt.wspX+", "+punkt.wspY+")");
    }
}

Ogólnie samą istotę kodu rozumiem ale jak to jest, że klasa UstawPunkt nawiązuje do klasy Punkt. Nie ma tutaj przecież zastosowanego dziedziczenia ani żadnego interfejsu. Więc po co to całe dziedziczenie i interfejsy kiedy można to robić w ten sposób?

Pozostało 580 znaków

2013-07-10 12:07

Rejestracja: 9 lat temu

Ostatnio: 6 lat temu

2

Ale Ty kompletnie mylisz dwie rzeczy. Dziedziczenie czyli inaczej rozszerzenie jakiejś klasy stosuje się w pewnych sytuacjach bo to, żeby budować jakieś konkretne hierarchie klas. Np. masz klasę Pracownik, po której dziedziczą klasy: Programista, Spawacz i Striptizer. Implementują one konkretne cechy dla każdego zawodu, natomiast klasa Pracownik jest klasą ogólną/bazową, która określa cechy wspólne dla tych wszystkich podklas.

Interfejs ma podobne zastosowanie, co klasa bazowa z tym, że:

  • metody nie posiadają ciała, tzn. każda klasa implementująca dany interfejs sama określa działanie danej metody, dostosowane do swoich potrzeb
  • wszystkie metody z interfejsu muszą być zaimplementowane w klasie, która go implementuje

W przykładzie, który podałeś nie ma żadnego związku pomiędzy klasami UstawPunkt i Punkt. Klasa UstawPunkt tworzy obiekt klasy Punkt i z niego korzysta, to wszystko.


Idiots, idiots everywhere.
edytowany 3x, ostatnio: allocer, 2013-07-10 12:11
Dokładniej, dziedziczenie jest relacją zwaną... "dziedziczeniem", natomiast podany przykład to relacja sumy (UstawPunkt posiada obiekt(y) klasy Punkt). - ShookTea 2013-07-13 18:55
A jeszcze dokładniej - dziedziczenie to relacja "is-a", a podany przykład podpada pod agregację. - allocer 2013-07-13 19:00
Z agregacją się zgadzam, zaś podawanie w "dokładniej dziedziczenie to is-a" słowa "dokładniej" jest błędem, bo is-a i relacja dziedziczenia to jedno i to samo. - ShookTea 2013-07-13 19:22
Chodziło mi o precyzyjne określenie samego dziedziczenia. - allocer 2013-07-13 19:37

Pozostało 580 znaków

2013-07-10 14:04
Moderator

Rejestracja: 16 lat temu

Ostatnio: 6 minut temu

0

@rubesom przeczytaj to: Klasy Abstrakcyjne
składnia trochę inna bo C++, ale idea ta sama


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...

Pozostało 580 znaków

2013-07-13 17:34

Rejestracja: 7 lat temu

Ostatnio: 1 miesiąc temu

0

Trochę poczytałem ale dalej nie mogę rozwiązać jednego problemu.
Mam klasę pojazdy która określa jakieś metody, mam klasę rower, samochod, deskorolka do których implementuje metody z klasy pojazdy i tam używam tych metod, następnie mam główną klasę gdzie odbywają się wszystkie procesy. Mogę dziedziczyć do głównej klasy ale tylko z jednej podklasy np. samochod, a co z resztą?

Głównie chodzi mi o to, że klasa pojazdy określa metody, w klasach rower, samochod, deskorolka chciał bym im przypisać konkretne już wartości a w klasie głównej już wyświetlać podklasy rower, samochod, deskorolka.

Jak to zrobić? Może klasa pojazdy i klasy rower, samochod, deskorolka powinny być interfejsami? Nie mam już pomysłu.

Pozostało 580 znaków

2013-07-13 17:39

Rejestracja: 9 lat temu

Ostatnio: 4 lata temu

0

pamiętaj tylko że Merkury ma dziedziczyć po Marsie

a srsly:
o mój boże, co?
klasa główna nie ma po niczym dziedziczyć. Pokaż w kodzie co Ty kombinujesz
I nie nazywaj klas w liczbie mnogiej

najlepiej w ogóle na razie zapomnij że istnieje coś takiego jak dziedziczenie - napisz kilka programów i ogarnij klasy jako takie
w prostych programach raczej nie ma dużo okazji żeby w ogóle skorzystać z dziedziczenia


Pół giga extra na dropboxie? Pół giga extra na dropboxie! Tyle wygrać! >>Klik here<<
edytowany 1x, ostatnio: unikalna_nazwa, 2013-07-13 17:42
Pokaż pozostałe 2 komentarze
@ShookTea, dlaczego klasa główna nie powinna dziedziczyć po klasie innej niż Object? - bogdans 2013-07-13 19:28
Ponieważ ułatwia to zrozumienie kodu. - ShookTea 2013-07-13 20:01
Gdzieś to wyczytałeś, czy Tobie ułatwia zrozumienie? - bogdans 2013-07-13 20:28
oh łał, bogdans znowu się czepiasz skrótów myślowych. Chodziło o ten przypadek - na pewno nie ma dziedziczyć z klasy "deskorolka" - unikalna_nazwa 2013-07-13 23:58
Nie zawsze się czepiam, ale to jest dział Newbie, a autor wątku jest SuperNewbie, idei dziedziczenia nie rozumie i nie wyłapie skrótów myślowych. - bogdans 2013-07-14 07:26

Pozostało 580 znaków

2013-07-13 18:00
Moderator

Rejestracja: 16 lat temu

Ostatnio: 6 minut temu

0

@rubesom WTF? Chcesz w klasie z "main" dziedziczyć z klasy Pojazdy? PO CO? Tam masz tworzyć OBIEKTY klas a nie bawić się w dziedziczenie!


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...

Pozostało 580 znaków

2013-07-13 18:32

Rejestracja: 7 lat temu

Ostatnio: 1 miesiąc temu

0

Myślałem, że opisałem rzeczowo o co mi chodzi ;D.

Mam klasę pojazd (liczba pojedyncza) w której określam parametry, np. liczba kół, jazda, kolor, .... Następnie mam klasy które są różnymi pojazdami i mają mieć w sobie te elementy z klasy "pojazd". Mam również główną klasę w której jest między innymi coś takiego jak

ApplicationListener 

dzięki któremu wszystko mi się rysuje.

Jak to połączyć? Specjalnie nie używałem tutaj sformułowań typu dziedziczenie czy interfejs bo pewnie ciągle mylę co z czym.

No to w tej głownej klasie powinieneś mieć kolekcję pojazdów zapewne ;] - Shalom 2013-07-13 18:45

Pozostało 580 znaków

2013-07-13 18:45

Rejestracja: 6 lat temu

Ostatnio: 1 rok temu

0

Masz abstrakcyjna klase pojazd, nadrzedna nad wszystkimi poniewaz posiada elementy wspolne dla wszystkich pojazdow, z niej mozesz wyprowadzic klase na przyklad auto, tu juz pole sie zaweza a dalej mozesz z auta odziedziczyc klase auto terenowe.Hierarchia klas musi isc od tych bardziej ogolnych do tych bardziej szczegółowych.

Pozostało 580 znaków

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