Manipulowanie kolekcją obiektów za pomocą interfejsu.

0

Witam,

mam pytanie odnośnie interfejsu. Z tego co wiem to interfejs pozwala na manipulowaniem kolekcją różnych obiektów. Więc napisalem sobie krótki programik:

public interface Drivable {
    public void accelerate();
    public void stop();
}

class BMW implements Drivable {

    public void accelerate() {
        System.out.println("BMW acc");
    }

    public void stop() {
        System.out.println("BMW stop");
    }
}


class Honda implements Drivable{

    public void accelerate() {
        System.out.println("HONDA acc");
    }

    public void stop() {
        System.out.println("HONDA stop");
    }
    
}
public class InterfaceTest {

    public static void main(String[] args) {
        Drivable vehicle= new BMW();
        vehicle.stop();  //Tutaj wywołuję metode stop() tylko z klasy BMW
       }
}

Chciałbym za pomocą interfejsu wywołać metodę np. stop() we wszystkich klasach, które implementują interfejs Drivable.

Na pewnym forum znalazłem taką możliwość, aby w klasie InterfaceTest stwożyc taka pętle:

  for (Drivable vehicle : vehicles) {
    vehicle.accelerate();
  }

Lecz wtedy kompiler mi zgłasza błąd.

Z góry dziękuję za pomoc i pozdrawiam.

0

Z tego co wiem to interfejs pozwala na manipulowaniem kolekcją różnych obiektów.

Interfejs nie do końca służy do tego o czym piszesz -

Wytłumaczę Ci to na prostym przykładzie:

interfejs to innymi słowy pewien kontrakt. Kontrakt, który mówi, że klasy implementujące interfejs na pewno będą implementowały metody tego interfejsu (jak tego nie wiemy...).

A teraz abstrahując od programowania - świetnym przykładem interfejsu z życia codziennego jest gniazdko elektryczne z bolcem. Co o nim wiemy - ma wystający bolec i dwie dziury, wszystko ustawione w określonej odległości od siebie. Nie wiadomo jak jest takie gniazdko podłączone do kabli w ścianie bo z przodu widać tylko dziury i bolec. Ale jako użytkownik gniazdka wierzysz, że elektryk, który je podłączał podłączył je poprawnie i jeśli wetkniesz do niego wtyczkę, to urządzenie na drugim końcu wtyczki powinno zostać zaopatrzone w prąd.

Zatem - wiesz jak wygląda interfejs gniazdka. Ale teraz wracając do Twojego problemu - mimo, że wiesz, jak wygląda ten interfejs to czy jesteś w stanie na przykład odłączyć od wszystkich gniazdek świata kable?

No raczej nie. Ale gdybyś wiedział dokładnie ile jest tych gniazdek, gdzie one są to w pewnym skończonym czasie udałoby się odłączyć i owe kable.

Podobnie jest z Twoim interfejsem Drivable. Nie sposób kazać wszystkim pojazdom się zatrzymać czy przyspieszyć, ale na pewno można to zrobić w stosunku do tych, do których masz dostęp.

W Javie dostęp będzie oznaczał, że masz do pojazdu (będącego zarazem obiektem) referencję. Te referencje możesz trzymać w jakimś, generalnie mówiąc kontenerze czy kolekcji.

To co napisałeś to jest pętla, która iteruje po elementach kolekcji (bądź tablicy) i wywołuje na nich polimorficznie akcje interfejsu. Ale tej kolekcji przecież nie stworzyłeś.

Musiałbyś zrobić na przykład:

List<Drivable> vehicles = new ArrayList<Drivable>();
vehicles.add(new BMW());
vehicles.add(new Honda())

Wtedy pętla zadziała. </quote>

0

Dziękuję za bardzo szybką i wyczerpującą odpowiedź. Nasuwa mi się jeszcze jedno pytanie. Oprócz tego że klasa implementując interfejs "obiecuje" implementacje jego wszystkich metod, to kiedy podczas modelowania programu (np. za pomocą UML) mogę sobie powiedzieć "tu wykorzystam interfejs bo.....".
Jak na razie programując nigdy nie pisałem swoich interfejsów bo nie widziałem ku temu potrzeby.
Mile by był widziany jakiś mały przykładzik :-) .

pozdrawiam

0

Napisałem program do rysowania wykresów funkcji. W programie wykorzystałem interface:

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

Część rysująca oczekiwała (między innymi) na parametr typu Function, mogłem więc przekazać jej dowolną
klasę implementującą ten interface. Dla funkcji rysującej przekazana klasa była nieistotna, ważne było to że
jest w niej metoda compute(double) i można jej użyć do obliczenia wartości funkcji. Kompilator mógł sprawdzić, że metoda compute(double) rzeczywiście jest.

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