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/Interfejs_%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.

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.

0

Ale co chcesz łączyć?
Wszystkie klasy pojazdów to pewien schemat i model abstrakcji. W klasie głównej (tam, gdzie masz metodę main) tworzysz konkretne obiekty typu Pojazd. Pokaż kod bo ciężko się domyślić o co Ci konkretnie chodzi.

0
PanKalmar napisał(a):

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.

Czyli klasa którą ja opisuję w ten sposób, że rysuje mi tło i inne ważne elementy ta główna(która docelowo jest nazwana "Main") dziedziczy z klasy abstrakcyjnej która z kolei jest nad klasą dla pozostałych? Jeżeli teraz dobrze rozumiem to będę uradowany inaczej się już załamie...

0

@rubesom nie, zupełnie nie. W ogóle źle to zaprojektowałeś. Lekcja na dziś: wzorzec kompozyt!
Zrozum że dziedziczenie określa relację "jest szczególny przypadkiem". Samochód "jest szczególnym przypadkiem" pojazdu. Main NIE JEST.

Poza tym każdy obiekt powinien SAM wiedzieć jak się narysować. Metoda main() powinna tylko uruchamiać rysowanie się obiektów. Przykład:

class Runner{
  public static void main(String[] args){
    List<Pojazd> pojazdy = new ArrayList<Pojazd>();
    pojazdy.add(new Samochod());
    pojazdy.add(new Rower());
    pojazdy.add(new Pociag());
    pojazdy.add(new Samolot());

    //rysowanie
    for(Pojazd p : pojazdy){
        p.narysujSie(graphics);
    }
  }
}
0
package pl.wp.xxx;

import com.badlogic.gdx.InputProcessor;

public class Akcja implements InputProcessor
{


	public static void main(String[] args) 
	{


	}

	@Override
	public boolean keyDown(int keycode) {
		System.out.println("xyz" + keycode);
		return true;
	}
package pl.wp.xxx;

import com.badlogic.gdx.ApplicationListener;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL10;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;

public class zzz implements ApplicationListener {
	Texture obrazek, obrazek2;
	OrthographicCamera camera;
	SpriteBatch batch;

	
	public static final String VERSION ="0.0.0.01 Pre-Alpha";

	@Override
	public void create() {
	
		obrazek2 = new Texture (Gdx.files.internal("logo2.png"));
		obrazek = new Texture(Gdx.files.internal("ss.png"));
		camera = new OrthographicCamera();
		camera.setToOrtho(false, 800, 480);

		batch = new SpriteBatch();
		Gdx.input.setInputProcessor(new Akcja());
		
	}
package pl.wp.xxx;

import com.badlogic.gdx.backends.lwjgl.LwjglApplication;
import com.badlogic.gdx.backends.lwjgl.LwjglApplicationConfiguration;

public class Main {
	public static void main(String[] args) {
	      LwjglApplicationConfiguration cfg = new LwjglApplicationConfiguration();
	      cfg.title = "Prosta gra " + zzz.VERSION;
	      cfg.useGL20 = true;
	      cfg.width = 800;
	      cfg.height = 480;
		new LwjglApplication(new zzz(), cfg);
	}
}

Jak to się dzieje/gdzie jest powiązanie/która to linijka kodu, że po stworzeniu klasy Akcja i zaimplementowaniu tam procesora oddziałowy-wuje ona na klasę Main?
Wystarczyło, że do klasy zzz w merodzie create dodałem

Gdx.input.setInputProcessor(new Akcja());

.

dodanie znaczników <code class="java"> - fp

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