2008-12-08 6 views

Répondre

16

Réponse courte: Non

Légèrement plus Réponse: Oui, si vous héritez plusieurs interfaces, et une seule classe de base. Puisque c'est généralement la raison de MI (vous voulez implémenter plusieurs interfaces), c'est généralement suffisant. Cependant, dans les rares cas où le MI «réel» est utile, .NET vous empêche de le faire.

+6

Héritant une interface est pas vraiment héritage si ... –

+0

@Orion Edwards: comment est-ce pas? L'héritage définit la relation «est un», et les interfaces sont une façon de définir ce qu'est un objet «est». Si j'hérite ISerializable, je dis "je suis un ISerializable", et me traiter comme un ISerializable fonctionne comme prévu. –

+0

En plus du commentaire de @Harper Shelby, une application volontaire de ce type de restriction est généralement considérée comme une bonne pratique en C++ (au lieu d'interfaces vous auriez des classes de base abstraites). – Richard

4

Il est possible de manière restreinte dans VB.Net de la même manière qu'en C#: via Interfaces. Comme une interface est essentiellement une classe de base pure-abstraite, vous pouvez en hériter autant que vous le souhaitez et d'une classe réelle.

1

Probablement ce que vous voulez faire est vraiment la composition ou l'agrégation (voir here for design pattern). Peut-être que vous définissez un comportement. Vous pouvez toujours implémenter une interface SomeInterface dans la classe de base, avoir un membre de type SomeInterface (qui laisse n'importe quelle classe implémentant SomeInterface et donc avoir le code implémentant), dans le constructeur des membres passer une référence à la classe de base celui-ci le possède si nécessaire (si c'est le cas, essayez d'ajouter une autre interface pour définir les callbacks, la classe de base l'implémentera et la sous-classe l'aura comme type de variable membre). Utilisez les appels à la classe membre pour implémenter SomeInterface. De cette façon, le code est implémenté dans une autre classe, ce qui le rend facile à maintenir, mais vous ne faites pas d'héritage multiple.

L'idée derrière la composition est qu'un moteur n'est pas une voiture mais une voiture a un moteur. La voiture a besoin d'un moteur, mais n'a pas besoin de savoir comment fonctionne l'ensemble d'un moteur, mais comment l'interfacer. Donc, le moteur ne devrait pas hériter de la voiture. Mais avoir la voiture mettre en œuvre le moteur est stupide. Ainsi, la voiture reçoit un moteur en tant que membre de la voiture entière, mais en tant qu'objet. La voiture a un moteur dans le cadre de sa composition.

On dirait que ce que vous faites est plus un comportement, comme un objet de canard qui a un comportement de charlatan, mais les canards en caoutchouc sont des canards, mais ne coulez pas mais coulez. Donc, ils diffèrent des objets de canard colvert, mais les deux ont de nombreuses autres caractéristiques de canard en commun. Donc vous voulez avoir une interface de charlatan que chacun implémente différemment. Mais beaucoup de canards se chargent de cette interface, donc vous ne voulez pas avoir à écrire des charlatans pour chacun d'entre eux. C'est là que vous utilisez la composition pour implémenter l'interface de comportement de charlatan.

1

Pour autant que je sais VB.net ne supporte pas l'héritage multiple en général, mais vous pouvez atteindre une sorte d'héritage multiple en travaillant avec des interfaces (en utilisant « Met en œuvre » au lieu de « Hérite »):

Public Class ClassName 
    Implements BaseInterface1, BaseInterface2 

End Class 

Cela fonctionne bien pour les classes mais j'aimerais avoir une interface héritant de certaines interfaces de base. Quelque chose comme ça:

Public Interface InterfaceName 
    Implements BaseInterface1, BaseInterface2 

End Interface 

Mais le mot-clé "Implements" n'est pas autorisé pour les interfaces (ce qui est logique, bien sûr). J'ai essayé d'utiliser une sorte de classe abstraite que je sais de Java:

Public MustInherit Class InterfaceName 
    Implements BaseInterface1, BaseInterface2 

End Class 

Mais maintenant, je dois mettre en œuvre les méthodes définies de BaseInterface1 et BaseInterface2 dans la classe InterfaceName. Mais comme InterfaceName doit être une interface, je ne veux pas non plus implémenter ces méthodes dans cette classe.

En C#, vous pouvez le faire assez facile:

public interface InterfaceName: BaseInterface1, BaseInterface2 {} 
Questions connexes