La différence entre l'utilisation d'une interface et une classe abstraite a plus à voir avec le code de l'organisation pour moi, que l'application par le langage lui-même. J'utilise beaucoup lors de la préparation code pour les autres développeurs de travailler avec de sorte qu'ils restent à l'intérieur de la conception des modèles. Les Interfaces sont une sorte de "conception par contrat" par lequel votre code est d'accord pour répondre à un ensemble défini d'appels d'API qui peut être à venir à partir du code que vous n'avez pas aceess.
Alors que l'héritage de classe abstraite est une "est une" relation, qui n'est pas toujours ce que vous voulez, et de mettre en œuvre une interface est plus un "agit comme une" relation. Cette différence peut être très importante dans certains contextes.
Par exemple, disons que vous avez une classe abstraite Compte de nombreux autres classes d'étendre les types de comptes et ainsi de suite). Il a un ensemble de méthodes qui sont seulement applicables à ce type de groupe. Cependant, certains de ces compte les sous-classes en œuvre Versionable, ou Listable, ou de les modifier de sorte qu'ils peuvent être jetés dans les contrôleurs de s'attendre à l'utilisation de ces Api. Le contrôleur ne se soucient pas de ce type d'objet, il est
En revanche, je peux aussi créer un objet qui ne s'étend pas de Compte, qu'un Utilisateur classe abstraite, et de toujours mettre en œuvre Listable et Modifiable, mais pas Versionable, qui n'a pas de sens ici.
De cette façon, je suis en train de dire que FooUser sous-classe n'est PAS un compte, mais N'agissent comme un objet Modifiable. De même BarAccount s'étend de Compte, mais n'est pas un Utilisateur de la sous-classe, mais met en œuvre Modifiable, Listable et aussi Versionable.
En ajoutant tous ces Api pour Modifiable, Listable et Versionable dans les classes abstraites lui-même ne serait pas seulement être encombré et laid, mais soit de dupliquer les interfaces communes en Compte et l'Utilisateur, ou la force de mon objet Utilisateur à mettre en œuvre Versionable, probablement juste de lancer une exception.