2009-04-19 8 views
2

Quels sont les avantages et les inconvénients d'avoir plusieurs héritages? Pourquoi n'avons-nous pas plusieurs héritages en C#?Quels sont les avantages et les inconvénients d'avoir plusieurs héritages?

MISE À JOUR Ok donc il est actuellement évité en raison de la question avec des affrontements résoudre la méthode parent est appelé etc. Certes, cela est un problème pour le programmeur à résoudre. Ou peut-être que cela pourrait être résolu de manière similaire à SQL où il y a un conflit plus d'informations sont nécessaires, c'est-à-dire que ID peut avoir besoin de devenir Sales.ID pour résoudre un conflit dans la requête.

+0

http://stackoverflow.com/questions/225929/what-is-the-exact-problem-with-multiple-inheritance - semble être une question similaire –

Répondre

1

La principale est que si deux classes ont une méthode avec le même nom, la nouvelle sous-classe ne sait pas laquelle appeler. En C#, vous pouvez effectuer une forme d'héritage multiple en incluant des instances de chaque objet parent dans l'enfant.

class MyClass 
{ 
    private class1 : Class1; 
    private class2: Class2; 

    public MyClass 
    { 
     class1 = new Class1; 
     class2 = new Class2; 
    } 
    // Then, expose whatever functionality you need to from there. 
} 
2

Je donnerai un pro ici basé sur un rapport C++-écrivain que je suis converting to REALbasic (qui dispose d'interfaces, mais seulement un seul héritage).

L'héritage multiple facilite la composition de classes à partir de petites classes de base mixin implémentant des fonctionnalités et possédant des propriétés à mémoriser. Une fois bien fait, vous pouvez obtenir beaucoup de réutilisation du petit code sans avoir à copier et coller du code similaire pour implémenter des interfaces.

Heureusement, REALbasic a étend méthodes qui sont comme les méthodes d'extension a récemment ajouté à C# en C# 3.0. Ceux-ci aident un peu avec le problème, particulièrement car ils peuvent être appliqués aux matrices. Je me suis quand même retrouvé avec des hiérarchies de classes plus profondes suite au repliement de ce qui était auparavant des classes multi-héritées.

0

Lorsque vous héritez de quelque chose que vous affirmez que votre classe est de cette (base) de type dans tous les sens, sauf que vous pouvez mettre en œuvre quelque chose de légèrement différent ou ajouter quelque chose, est en fait extrêmement rare que votre classe est 2 choses à la fois. Habituellement, il a juste un comportement commun à 2 choses ou plus, et une meilleure façon de décrire cela consiste généralement à implémenter plusieurs interfaces dans votre classe. (ou peut-être encapsulation, selon votre situation)

0

C'est une de ces bizarreries qui m'aident à ne pas tirer moi-même dans le pied, un peu comme dans Java. Bien qu'il soit agréable d'étendre les champs et les méthodes à partir de sources multiples (imaginez un téléphone mobile moderne, qui hérite des lecteurs MP3, des caméras, des satellites et de l'humble Old School Mobile Phone), les conflits ne peuvent pas être résolus par le compilateur seul.

3

C'est juste un autre outil dans la boîte à outils. Parfois, c'est exactement le bon outil. Si c'est le cas, avoir à trouver une solution de contournement parce que la langue l'interdit réellement est une douleur et conduit à de bonnes opportunités pour bousiller.

Les avantages et les inconvénients ne peuvent être trouvés que pour un cas concret. Je suppose qu'il est assez rare de trouver un problème, mais qui sont les concepteurs de la langue pour décider comment je vais aborder un problème spécifique?

+0

Bien en C# ce n'est pas encore un outil dans la boîte ! :) –

+0

+1, mais d'après ce que je comprends, c'est seulement le seul bon choix dans de rares cas. – hasen

+0

Juste comme un «exemple typique de manuel»: Un chat de maison est à la fois un mammifère et un animal de compagnie. Exprimer cela comme une composition est au mieux gênant. Il y a des mammifères qui ne sont pas des animaux de compagnie, et des animaux qui ne sont pas des mammifères. Comme un animal de compagnie, un chat pourrait avoir un propriétaire, une statistique de loyauté, un numéro de taxe. En tant que mammifère, il peut avoir le statut d'alimentation, la longueur globale, la longueur de la queue et la couleur de la fourrure. – Svante

Questions connexes