Interfejs definiuje kontrakt (jakie metody istnieją) i wspiera wielokrotne dziedziczenie typu. Klasa abstrakcyjna może współdzielić stan i implementację, ale możesz dziedziczyć tylko po jednej klasie. Interfejs jest dla „umiejętności”, a abstrakcyjna dla wspólnej bazy zachowania.