Używanie tych dwóch elementów jest całkowicie normalne. Rozważmy na przykład AbstractList
(wdrażanie List
) i AbstractMap
(wdrażanie Map
) w JDK.
Moja odruchowa reakcja byłaby mają abstrakcyjne klasy implementują interfejs, a następnie mieć konkretne klasy wywodzą się z nim:
abstract class Base implements TheInterface {
/* ...shared methods... */
}
class Concrete1 extends Base { }
class Concrete1 extends Base { }
Ale twoje pytanie podniesienie innej możliwości mi myśleć, a ja nie można zobaczyć wiele argumentów przeciwko robią to w ten sposób:
abstract class Base {
/* ...shared methods... */
}
class Concrete1 extends Base implements TheInterface { }
class Concrete1 extends Base implements TheInterface { }
Ponadto widzę argumentu dla robi to w ten sposób, zwłaszcza, że usuwa sprzężenia abstrakcyjnej C lass i interfejs. Jeśli masz inną klasę, która wymaga tej funkcji, ale nie wymaga potrzeby implementacji interfejsu, możesz to zrobić elastycznie.
Istnieje również trzecia opcja: Kompozycja. Nie może mieć klasę abstrakcyjną w ogóle, ale raczej mają wiele konkretnych klas, które implementują interfejs korzystanie wspólny klasy pomocnika w ich realizacji:
class Helper {
/* ...shared methods... */
}
class Concrete1 implements TheInterface {
/* ...uses instance of Helper */
}
class Concrete1 implements TheInterface {
/* ...uses instance of Helper */
}
ma to, że sama elastyczność, w innej formie.
Nie ma powodu, dla którego nie powinny one być –
Nop, wcale. W rzeczywistości większość tego, co robię, jest właśnie taka. –