piątek, 10 sierpnia 2012

Konstruktor w interfejsie i klasie abstrakcyjnej?

wstęp

Abstrahując od tego, na co pozwala nam dany język programowania (np. PHP pozwala niestety na wszystko), to czy w interfejsie jest sens posiadać deklarację konstruktora? A co w przypadku klas abstrakcyjnych? Jak sądzicie, taka funkcjonalność może się przydać, czy raczej jest to coś zbędnego, czego najprawdopodobniej nigdy byście nie wykorzystali?

konstruktor w interfejsie

W przypadku interfejsu odpowiedź jest jednoznaczna - nie powinno być możliwości deklarowania konstruktora i, co więcej, nie miałoby to najmniejszego sensu. Dlaczego?

Interfejs jest gwarancją, że instancje klasy, która go implementuje dostarczają konkretną funkcjonalność, czyli sens tworzenia interfejsów jest tylko wtedy, gdy obiekt ma być przekazany do metody, która chce wykonać na nim określone operacje.
W powyższych dwóch zdaniach powinno się rzucić w oczy jedno, bardzo istotne słowo - obiekt.
Musimy posiadać obiekt, który zapewnia daną funkcjonalność, a to znaczy, że został on już wcześniej stworzony.

Interfejs zapewnia funkcjonalność, natomiast konstruktor nie jest częścią funkcjonalności, jest częścią implementacji. I nawet jeżeli wszystkie klasy implementujące go, posiadają taką samą deklarację konstruktora/konstruktorów, nie jest to powód, aby dorzucać ją do interfejsu.

konstruktor w klasie abstrakcyjnej

Czy analogicznie jest w przypadku klas abstrakcyjnych?
Nie do końca. Mimo, że klasy abstrakcyjne i interfejsy są dla wielu programistów bardzo zbliżonymi bytami, to w przeciwieństwie do interfejsu, abstrakcje powstają z powodów podobieństw w implementacji. Klasy posiadają część wspólną? To oznacza, że jest sens stworzyć rodzica, do którego zostanie ona wyniesiona.

Co w takim razie z konstruktorem?
Tworzenie deklaracji nie daje nam żadnych korzyści, jednak co innego w przypadku definicji. Jeżeli wiemy, że klasy potomne będą tworzone w ten sam sposób, to umieszczenie konstruktora w abstrakcie sprawia, że nie będziemy zmuszeni duplikować kodu. Tym bardziej jeżeli w konstruktorze są przekazywane parametry, bądź przy tworzeniu konkretnych instancji wykonywane są pewne, takie same, instrukcje.

deklaracja a definicja

Właśnie na tym polega różnica, na tym, że w klasie abstrakcyjnej, poza deklaracjami, możemy również definiować metody.
Nie ma żadnego sensu deklarowanie konstruktora, ponieważ tworzenie obiektu jest zawsze bezpośrednio związane z implementacją klasy. Co innego z wyniesieniem definicji. Jeżeli jest część wspólna, to nie jestem w stanie dostrzec żadnych przeciwwskazań:)