interfejsy - jak to dziala?

Odpowiedz Nowy wątek
2008-05-08 18:23

Rejestracja: 16 lat temu

Ostatnio: 11 lat temu

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?

Pozostało 580 znaków

bogdans
2008-05-08 19:13
bogdans
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

Pozostało 580 znaków

2008-05-09 11:27

Rejestracja: 16 lat temu

Ostatnio: 11 lat temu

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?

Pozostało 580 znaków

bogdans
2008-05-09 12:33
bogdans
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

Pozostało 580 znaków

Andrzej G
2008-05-09 16:13
Andrzej G
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

Pozostało 580 znaków

Odpowiedz

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