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.
dupe: http://stackoverflow.com/questions/56867/interface-vs-base-class – juan
Jest nieco inny, ponieważ odnosi się do abstrakcyjnych klas bazowych, a nie do wszystkich klas bazowych. –
Usunąłbym zduplikowany link, ale nie mam takiego poziomu dostępu. –