Jakie są różnice pomiędzy interfejsem a klasą abstrakcyjną?
- Jeśli klasa bazowa nie musi bądź nie powinna dostarczać implementacji danych funkcjonalności a dla każdej klasy trzeba będzie osobno implementować funkcjonalność lepiej użyć interfejsu
- Jeśli klasa bazowa powinna dostarczać implementację pewnych funkcjonalności i w niektórych przypadkach mogą być one nadpisane w klasach pochodnych lepiej użyć klasy abstrakcyjnej
- Klasa może implementować jeden lub wiele interfejsów
- Klasa może dziedziczyć tylko po jednej klasie abstrakcyjnej
- Składowe interfejsu nie mogą być oznaczane atrybutem dostępu (domyślnie ustawiony jest public)
- Składowe klasy abstrakcyjne mogą być oznaczane atrybutami dostępu (private, protected itp)
- Interfejs umożliwia jedynie deklarację składowych, bez implementacji
- Klasa abstrakcyjna umożliwia zarówno tylko deklarację składowych jak i pełną implementację, która może być jednak przesłonięta w klasach pochodnych
- Interfejs może dziedziczyć jedynie po innych interfejsach
- Klasa abstrakcyjna może dziedziczyć po klasach abstrakcyjnych, interfejsach a nawet zwykłych klasach
- Jeśli sposób implementacji nie ma znaczenia lepiej jest użyć interfejsu
- Jeśli sposób implementacji może mieć znaczenie w niektórych przypadkach lepiej użyć klasy abstrakcyjnej
- Jeśli do interfejsu zostanie dodana nowa metoda trzeba prześledzić wszystkie klasy implementujące dany interfejs i dodać implementację nowej metody
- Jesli do klasy abstrakcyjnej zostanie dodana nowa metoda klasy dziedziczące po danej klasie abstrakcyjnej będą mogły z korzystać z implementacji w klasie bazowej więc kod będzie działał poprawnie
- W interfejsie nie możemy deklarować pól
- W klasie abstrakcyjnej możemy deklarować pola
- Interfejs nie może mieć konstruktora
- W klasie abstrakcyjnej możemy dostarczyć implementację konstruktora domyślnego