Obiekt w funkcji, interfejs

Odpowiedz Nowy wątek
2016-02-08 17:34

Rejestracja: 6 lat temu

Ostatnio: 4 lata temu

0

Witam,

borykam się z pewnym problemem, a raczej niewiedzą jak zapisać. Posiadam Interfejs Vectorable i klasę Vector2D.

public interface Vectorable {

    public void add(Vector2D vec);
}
public class Vector2D implements Vectorable{

    private double x;
    private double y;

    Vector2D(double x, double y) {
        setX(x);
        setY(y);
    }

    @Override
    public void add(Vector2D vec) {
        x = vec.getX();
        y = vec.getY();
    }
        //Settery, gettery

}

Wszystko wygląda niby ładnie pięknie, ale jakbym chciał zaimplementować ten interfejs dla klasy Vector3D nie miałby sensu. Nie można dodawać wektorów, które są w różnych wymiarach.

Pytanie brzmi następująco, w jaki sposób mogę w interfejsie zaznaczyć, aby argument funkcji przyjmował typ klasy, która implementuje interfejs?

public interface Vectorable {

    public double length();
    public void add(? vec); // Argument nazwany po klasie dziedziczącej
}

Pozostało 580 znaków

2016-02-08 17:38
Moderator

Rejestracja: 16 lat temu

Ostatnio: 3 godziny temu

Mozesz użyć do tego generica:

interface Vectorable<T extends Vectorable<T>> {
    public double length();
    public void add(T vec);
}

I masz wtedy klasę

public class Vector2D implements Vectorable<Vector2D>{
//
}

Ale to cie wcale nie chroni przez potworkiem w stylu:

public class Vector3D implements Vectorable<Vector3D>{
//
}

public class Vector2D implements Vectorable<Vector3D>{
//
}

;] Ale nic więcej sie tu zrobić chyba nie da.


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...
edytowany 3x, ostatnio: Shalom, 2016-02-08 17:41

Pozostało 580 znaków

2016-02-08 17:39

Rejestracja: 6 lat temu

Ostatnio: 4 lata temu

0

Elegancko, a jest jeszcze inna możliwość?
Lubię znać kilka sposobów :P

Pozostało 580 znaków

2016-02-08 18:37

Rejestracja: 8 lat temu

Ostatnio: 3 lata temu

Lokalizacja: Kraków

2

Inna możliwość jest taka, że nie robisz tego bezsensownego interfejsu.

Pozostało 580 znaków

Odpowiedz

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