2009-10-27 1 views
2

Quelle est la différence entre:Dois-je utiliser l'héritage ou l'interface?

type IFooable = 
    interface IDisposable 

    abstract Foo : (unit -> unit) 

et

type IFooable = 
    inherit IDisposable 

    abstract Foo : (unit -> unit) 

?

Si équivalent, dans quels cas dois-je utiliser l'un sur l'autre? Merci!

Répondre

6

(J'ai d'abord pensé que) Vous devez utiliser 'inherit' avec (au plus un) base classe. Vous pouvez utiliser 'interface' pour toutes les interfaces que vous allez implémenter. Donc, dans le cas de IDisposable, il doit s'agir d'une 'interface'.

EDIT, ok le compilateur le permet, mais cela pourrait être un bug, je vais regarder

EDIT: se révèle qu'il est un bug probablement l'autre manière, et les interfaces susceptibles vous forcer à utiliser « inherit » hériter d'autres interfaces, l'idée étant que les membres "hérités" sont toujours directement visibles dans le sens "interface implicite", alors qu'une déclaration "interface" sur une classe est une interface "explicite" qui nécessite une conversion à ce type d'interface pour utiliser ces membres. D'une manière ou d'une autre, nous sommes susceptibles de supprimer cette flexibilité dans la syntaxe du langage, de sorte qu'il n'y ait qu'une seule façon d'écrire ceci, plutôt que deux manières équivalentes.

+0

Super, merci Brian. – Stringer

+0

Cela a du sens. J'ai une meilleure compréhension de cela maintenant. Merci beaucoup! – Stringer

-1

Vous devriez utiliser des interfaces si vous n'utilisez que des méthodes abstraites. Parce que vous ne pouvez hériter que d'une classe mais vous pouvez implémenter plusieurs interfaces.

+1

vous pourriez ne pas recevoir downvotes si vous épelez vos mots. – recursive

0

J'ai tendance à utiliser l'héritage pour true oop (c'est-à-dire X isa Y) et les interfaces comme une sorte d'implémentation de décorateur.

probablement pas la manière "correcte" de le faire, mais nous l'aimons bien.

ce que je veux dire est X héritera Y, mais nous voudrons donner quelques fonctionnalités supplémentaires de V, W et Z.

« Jetta isa voiture, mais aussi IDiesel, igerman, IBroken "

c'est juste la façon dont mon projet actuel fait, et je vais probablement avoir downvoted pour « abus de oop », ou quelque chose :)

+0

Ça a l'air fou. Et si votre voiture implémente IBroken et IWorkingOrder? IToyota et IFord? – Stringer

+0

ok donc c'était un exemple terrible! :) en réalité, un meilleur exemple serait un TabControl qui a un tas de TabPages spécialisés. certains sont ITxRx parce qu'ils ont certains types de comportement. les autres sont un autre genre. un design fou, c'est sûr, mais bizarrement ça marche très bien. –

Questions connexes