Obiekt w funkcji, interfejs

Obiekt w funkcji, interfejs
CE
  • Rejestracja:ponad 11 lat
  • Ostatnio:około 9 lat
  • Postów:29
0

Witam,

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

Kopiuj
public interface Vectorable {

	public void add(Vector2D vec);
}
Kopiuj
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?

Kopiuj
public interface Vectorable {

	public double length();
	public void add(? vec); // Argument nazwany po klasie dziedziczącej
}
Shalom
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
1

Mozesz użyć do tego generica:

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

I masz wtedy klasę

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

Ale to cie wcale nie chroni przez potworkiem w stylu:

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

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

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


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 3x, ostatnio: Shalom
CE
  • Rejestracja:ponad 11 lat
  • Ostatnio:około 9 lat
  • Postów:29
0

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

Sopelek
  • Rejestracja:prawie 13 lat
  • Ostatnio:ponad 8 lat
  • Lokalizacja:Kraków
  • Postów:467
2

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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.