Interfejs a konstruktor

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?

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

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

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?

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.

0

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

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.

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

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!

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.

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