2009-02-17 10 views
14

Duplikat: Interface vs Base classJak zdecydujesz między używaniem abstrakcyjnej klasy a interfejsem?


byłem coraz głębiej w świat OOP, wzorce projektowe i ActionScript 3, i nadal jestem ciekawy jak wiedzieć, kiedy należy użyć klasy abstrakcyjnej (pseudo dla AS3, które nie obsługuje klas abstrakcyjnych) i interfejsu. Dla mnie oba służą jedynie jako szablony, które zapewniają wdrożenie pewnych metod w danej klasie. Czy różnica polega wyłącznie na tym, że klasy abstrakcyjne wymagają dziedziczenia, a interfejs jedynie się rozszerza?

Dzięki, Brian Hodge hodgedev.com

+0

dupe: http://stackoverflow.com/questions/56867/interface-vs-base-class – juan

+1

Jest nieco inny, ponieważ odnosi się do abstrakcyjnych klas bazowych, a nie do wszystkich klas bazowych. –

+0

Usunąłbym zduplikowany link, ale nie mam takiego poziomu dostępu. –

Odpowiedz

30

Użyj klasę abstrakcyjną jeśli masz jakieś funkcje, które chcesz to mieć podklasy. Na przykład, jeśli masz zestaw funkcji, które mają mieć wszystkie podstawowe podklasy klasy abstrakcyjnej.

Użyj interfejsu, jeśli chcesz uzyskać ogólne zamówienie na zachowanie/funkcjonalność. Jeśli masz funkcję lub obiekt, który chcesz wziąć w zestaw różnych obiektów, użyj interfejsu. Następnie możesz zmienić obiekt, który jest przekazywany, bez zmiany metody lub obiektu, który je przyjmuje.

Interfejsy są zazwyczaj luźne w porównaniu do klas abstrakcyjnych. Nie chciałbyś używać interfejsów w sytuacji, gdy ciągle piszesz ten sam kod dla wszystkich metod interfejsu. Użyj klasy abstrakcyjnej i raz zdefiniuj każdą metodę.

Ponadto, jeśli próbujesz utworzyć hierarchię dziedziczenia określonego obiektu, naprawdę nie chciałbyś tego robić za pomocą samych interfejsów.

Również w niektórych językach można mieć tylko jedną klasę podstawową, a jeśli obiekt ma już klasę podstawową, konieczne będzie wykonanie refaktoryzacji w celu użycia abstrakcyjnej klasy bazowej. Może to, ale nie musi oznaczać, że zamiast tego możesz użyć inteface.

Jak zauważa @tvanfosson, nie jest to zły pomysł, aby używać wielu interfejsów, kiedy naprawdę rozumiesz klasy abstrakcyjne i interfejsy, tak naprawdę nie jest to żadna z tych sytuacji. W szczególnej sytuacji można używać zarówno klas abstrakcyjnych, jak i interfejsów. Lubię korzystać z interfejsów czasami po to, aby ograniczyć dostęp do metody lub obiektu w obiekcie przekazanym w parametrze.

+0

Wielkie dzięki to było bardzo pomocne. –

+0

To jest proste, kciuki w górę ode mnie – JPReddy

2

Klasy abstrakcyjne oferują możliwość implementacji określonych metod i wymagają implementacji innych w klasie dziedziczenia. Dzięki interfejsom wszystko musi zostać zaimplementowane w klasie implementacji.

2

Jak zauważa @ m4bwav, podstawową różnicą jest to, że klasa abstrakcyjna może i często zapewnia domyślną implementację dla przynajmniej niektórych metod. Dzięki temu możesz użyć klasy abstrakcyjnej, aby zachować swój kod DRY (nie powtarzaj siebie), zachowując kod wspólny dla wszystkich klas dziedziczących po klasie abstrakcyjnej w samej klasie abstrakcji.

Myślę, że to jednak jest fałszywy dylemat. Nie musisz i prawdopodobnie nie powinieneś wybierać między interfejsami i klasami abstrakcyjnymi. W większości przypadków chciałbyś zdefiniować interfejs, a następnie poproś, aby twoja klasa abstrakcyjna zapewniała domyślną implementację szkieletu, jeśli jest wymagana/pożądana. Dla mnie byłoby pytanie, czy potrzebuję interfejsu lub interfejsu i klasy abstrakcyjnej, a nie interfejsu lub klasy abstrakcyjnej. Korzystanie z interfejsu uniezależnia twój kod od jakiejkolwiek konkretnej implementacji, nawet od implementacji klasy abstrakcyjnej.Jeśli zdecydujesz się na alternatywną implementację, użycie interfejsu umożliwiłoby to, natomiast jeśli miałbyś tylko klasę abstrakcyjną, musiałbyś refaktor, aby dodać interfejs później.

Jedyną sytuacją, w której widzę, że zapewnienie interfejsu w takiej sytuacji nie byłoby pożądane, jest chcieć, aby go ograniczyć, tak aby można było wykorzystać tylko swoją implementację. Używanie klasy abstrakcyjnej i posiadanie pewnych metod nie jest wirtualne, wymuszałoby użycie kodu w każdych okolicznościach, w których implementator wywodzi się z klasy.

Powiązane problemy