Załóżmy,że mam interfejs Loggable, którego zaimplementowałem w pewnej klasie Kwadrat, a ta z kolei była dziedziczona po abstrakcyjnej klasie Figura, czyli w skrócie w nagłówku:
public class Kwadrat extends Figura implements Loggable
Na końcu próbuję sobie utworzyć obiekt, aby móc sobie wywołać takie czy inne metody.
Wiem już, że kiedy definicja wygląda następująco:
Loggable f1 = new Kwadrat(x,y,dl_boku);
to mogę korzystać właściwie tylko z tych funkcji, których definicje umieściłem z interfejsie,
kiedy z kolei jest to
Figura f2 = new Kwadrat(x,y,dl_boku);
to mogę korzystać tylko z funkcji, które znalazły się w klasie Kwadrat, ale z tych co w Interfejsie już nie.
A dzięki zapisowi
Kwadrat f3 = new Kwadrat(x,y,dl_boku);
w końcu mogę korzystać ze wszystkich metod.
Pytanie brzmi: po co są te dwie powyższe wersje? Bo w jednym z egzaminacyjnych pytań znalazło się pytanie, czy to by zadziałało. Skoro jest to działające, to w jakich przypadkach, no bo teraz wydaje mi się to bezsensowne.
I jeszcze dla upewnienia: przykładowe
Figura f = new Figura();
nie dałoby się w ogóle utworzyć ze względu na to że klasa jest abstrakcyjna, co oznacza że się jej obiektów nie tworzy, a istnieje wyłącznie po to żeby sobie po niej dziedziczyć?