Jakie są różnice pomiędzy interfejsem a klasą abstrakcyjną?


Interfejs i klasa abstrakcyjna - różnice
  • 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
czerwo 03-10-2018 10:28
moim zdaniem tabelki 1, 4 oraz 6 mówią o tym samym

marcin90 03-10-2018 11:04
rzeczywiście trochę masło maślane... jeśli znajdę czas to poprawię odpowiedź.

januszgorszyciel 06-11-2018 09:05
Nie wiem gdzie globalnie to napisać ale strasznie mnie niszczą pytania 'Jaka jest różnica między tym a tym'... To niczego nie sprawdza oprócz tego czy ktoś zna jakieś definicje. Ja bym pytał bardziej w stylu 'Kiedy wykorzystasz interfejs, a kiedy klasę abstrakcyjną, dlaczego?'. Gdy zadaję takie pytania (w zależności od poziomu o którym mówimy) nie interesuje mnie czy ktoś pamięta definicję ze studiów tylko czy zna praktyczne zastosowania (junior), a dopiero później stojącą za tym teorię i kwestie teoretyczne (senior).

marcin90 06-11-2018 09:57
Hmmm byłem na kilku rozmowach i często miałem pytanie: Jakie są różnice pomiędzy 'tym a tym? Zgodzę się, że to pytanie sprawdza głównie definicje ale serio takie pytania się pojawiają.

januszgorszyciel 07-11-2018 11:13
Ja nie twierdzę, że się nie pojawia, bo sam je zadaje. Tylko tak jak napisałem - w zależności od poziomu o którym rozmawiamy pojawia się jedno albo jedno i drugie. Chodzi mi przede wszystkim o to, że mamy tutaj suchą teorię w odpowiedzi bez możliwości potwierdzenia przez kandydata praktycznej znajomości tego o czym się mówi. Promowana jest tu odpowiedź akademicka, pozbawiona życia, a chodziłoby o połączenie jednego i drugiego. Łatwo jest zadać pytanie o definicję bo wtedy łatwo ocenić czy ktoś mówi dobrze czy źle. Gdy przechodzimy do praktycznego zastosowania to również pytający zaczynają mieć problemy z oceną czy kandydat podaje poprawny przykład i wymaga to większego skupienia :)

alsenq 02-02-2022 01:37
Chyba nieaktualne ponieważ w najnowszej wersji C# różnice pomiędzy interfejsem a klasą abstrakcyjną są już minimalne..


© 2024 - SkillsTest.pl | | Regulamin | Polityka Prywatnosci