Dziedziczenie a Interfejsy

msm

W programowaniu obiektowym często się zdarza że musimy używać zupełnie odrębnych klas w ten sam sposób. Aby to było możliwe musimy w jakiś sposób zadeklarować że grupa klas oferuje podobną funkcjonalność. Pierwszym rozwiązaniem tego problemu było stworzenie dziedziczenia. Po jakimś czasie programiści niektórych języków wysokiego poziomu (m.in javy) zyskali nową konstrukcję - tzw. interfejsy. W C# zostały zaimplementowane zarówno interfejsy jak i dziedziczenie. W tym artykule skupię się na wskazaniu różnic między nimi.

  1. Podejście

Pierwsza różnica jest dość niewymierna. Interfejsy są traktowane jako 'informacja' że obiekt oferuje daną funkcjonalność. Klienta nie obchodzi wcale implementacja, a jedynie działanie. Inaczej jest w przypadku dziedziczenia - obiekty mają podobną budowę i rozwiązania, a kolejne ich podobne jedynie rozszerzają ich możliwości.

  1. Abstrakcyjność

Interfejsy są znacznie bardziej abstrakcyjne niż jakiekolwiek klasy. Klasy abstrakcyjne, mimo że nie mogą być bezpośrednio utworzone, mogą swoim potomnym przekazać nieabstrakcyjne metody i pola, a interfejsy nie przekazują nic.

  1. Pola

Interfejsy nie mogą deklarować pól (mogą za to posiadać deklarację właściwości, co na jedno wychodzi). Klasy bazowe mogą nie tylko posiadać deklarację pól, ale nawet (co zostało wspomniane powyżej) nadawać im konkretne wartości zdejmując ten ciężar z klas potomnych.

  1. Wielokrotne dziedziczenie

Tytuł punktu jest nieco przewrotny, bo akurat właśnie wielokrotne dziedziczenie (jawne) jest niemożliwe w C#. Za to każda klasa może implementować dowolną liczbę interfejsów.

  1. Rozszerzalność

W dodatku, do klasy bazowej można zawsze dodać kolejną metodę (nieabstrakcyjną). W przypadku interfejsu konieczna będzie zmiana wszystkich klas implementujących.

  1. DRY

O ile słuszne używanie klas może znacznie się przysłużyć zmniejszeniu ilości przepisywanego kodu, to interfejsy pozostają bez wpływu na jego ilość (a niewprawne stosowanie ich może prowadzić nawet - przez zmuszanie do implementacji nadmiarowej ilości metod - do jego zwiększenia).

0 komentarzy