Interfejs definiuje kontrakt; klasa może implementować wiele interfejsów, a interfejs może mieć metody domyślne/statyczne, ale nie ma stanu instancji. Klasa abstrakcyjna może zawierać pola, konstruktory i częściową implementację, ale dziedziczyć można tylko po jednej klasie. Interfejsy stosuj do „zdolności”, a abstrakcyjne do wspólnej logiki bazowej.