Pytanie z metod wirtualnych

0

Chciałbym mieć zwierzaki różnych gatunków, które mogą mieć ze sobą potomstwo - Koty tylko z Kotami, a Kury z Kurami. Dawanie potomstwa może przebiegać różnie dla różnych gatunków, ale chciałbym, aby do rozmnożenia np. 34 Królików z 2 użyć tej samej metody(parametryzowanej typem) co do rozmnażenia np. Kur. Logiczne, żeby wszystkie gatunki implementowały wspólny interfejs albo klasę abstrakcyjną:

abstract class Zwierzak
{
abstract Zwierzak potomek(Zwierzak z);
}

Niestety takie rozwiązanie nie działa, bo tutaj metoda potomek pozwala na wywołanie dla Kury i Kota. W jaki sposób zastrzec, że parametr i wynik metody potomek mają być tego samego typu(a nie tylko oba Zwierzakami).

abstract class Zwierzak
{
abstract <E extends Zwierzak> E potomek(E e1);
}

też nie działa, bo co prawda Kura nie da potomka z Kotem, ale i tak implementując metodę potomek w klasie Kura muszę napisać, jak działa dla dowolnych 2 zwierzaków jednego gatunku.

Mam nadzieję, że ktoś to zrozumiał i podsunie mi jakieś rozwiązanie.

0

Trochę inaczej, za pomocą genericsowego interfejsu:

interface Zwierzak<T>{
  T potomek(T t);
}

class Kura implements Zwierzak<Kura>{
   Kura potomek(Kura t);
}
0

O fajnie! Nawet nie wiedziałem, że tak można. Dziękuję.

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