interfejsy - jak to dziala?

0

Witam

Ucze sie dopiero javy i natknalem na pierwszy problem. Sa nim mianowicie interfejsy.

W ksiazce mam przyklad wykorzystania interfejsow:
klasa Arrays posiada metode sort. Metoda ta dziala tylko dla obiektow ktore implementuja interfejs Comparable.
Przegladalem kod zrodlowy metody sort i nigdzie nie znalazlem fragmentu kodu, ktory by cos "mowil" o interfejcie comparable.
W jaki sposob dziala ten mechanizm? W jaki sposob metoda wymusza implementacje danego interfejsu i w jaki sposob obiekt Arrays wie ze sortowany obiekt zaimplementowal wymagany interfejs?

0

Po mojemu działa to tak. Tworzysz nową klasę K, masz zamiar sortować obiekty klasy K.

public class K ... implements Comparable<K>
{
}

żeby to się dało skompilować klasa K musi implementować metodę compareTo(K ob), metoda ta z grubsza mówi, który z dwóch obiektów klasy K jest większy.
Informacja, że klasa implementuje interfejs Comparable znajduje się w pliku K.class, zatem metoda
Arrays.sort() może "w ciemno" wywoływać przy porównywaniu metodę compareTo().
pozdrawiam

0

hmm ok a jesli nie zaimplementuje interfejsu comporable to skad kompilator wie, ze ten interfejs jest wymagany? Co dostarcza informacji ze dany interfejs musi byc dolaczony do klasy aby mogla byc wykonana okreslona metoda?

Np projektujac interfejs jak zrobic zeby byl on wymagany przez konkretne metody projektowanej klasy?

0

Ostatnie pytanie stawia chyba problem na głowie. Chodzi raczej o to jak projektować metody klasy by wymagały od swoich argumentów implementacji pewnego interfejsu.
interfejs:

public interface Function
{
    double compute(double x);
}

klasa implementująca:

public class Sinus implements Function
{
    public double compute(double x)
    {
        return Math.sin(x);
    }
}

klasa z metodą wymagająca implementowania interfejsu Function

public class Wykres
{
    public static void main(String[] args)
    {
        if(args.length>0)
        {
            Object ob=pobierz(args[0]);
            if (ob==null)
            {
                System.exit(0);
            }
            narysuj(ob);
        }

    }
    //------------------------
    private static Object pobierz(String nazwaKlasy)
    {
        Object ob=null;
        try
        {
            Class klasa=Class.forName(nazwaKlasy);
            ob=klasa.newInstance();
        }
        catch(Exception e)
        {
            System.out.println(e.toString());
        }
        return ob;
    }
    //------------------------
    private static void narysuj(Object ob)
    {
        try
        {
            Function f=(Function)ob;
            System.out.println("Zaczynam rysowanie");
        }
        catch(Exception e)
        {
            System.out.println(e.toString());
        }
    }
}

pozdrawiam

0

Witam
Zrobiłem interface:

public interface Pracownik {
String zawod(String zawod);
}

Teraz chciałbym pobrać zawód pracownika, raz żeby to był spawacz a drugi raz lekarz

public class Spawacz extends Osoba implements Pracownik{

public String zawod(String zawod)
{
    return zawod;
}

}

klasa osoba

public class Osoba {

public void setImie(String imie){

System.out.print(" "+imie);
}
public String getImie(String imie){
return imie;
}

public void setNazwisko(String nazwisko){
System.out.println(" "+nazwisko+ " pracuje.");
}

public String getNazwisko(String nazwisko){
return nazwisko;
}

}

A Main to

public class Main {

public static void main(String[] args){
	
	Lekarz pLekarz = new Lekarz();
	Spawacz pSpawacz = new Spawacz();
	
	pLekarz.setImie("Jan");
	pLekarz.setNazwisko("Nowak");
	
	pGornik.setImie("Stanisław");
	pGornik.setNazwisko("Kowalski");
	
	//Upcasting
	Main.zacznijPrace(pLekarz);
	Main.zacznijPrace(pSpawacz);
}
	/*
	 * Pracownik p rozpoczyna pracę.
	 * 
	 */
	public static void zacznijPrace(Pracownik p){
		if(p!=null){
			
			*polimorficzne wywołanie metody pracuj*
			p.zawod();
		}
	}
}

Dobrze robie?Pozdrawiam

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