OVH Cloud OVH Cloud

Héritage multiple

14 réponses
Avatar
Titeuf
Bonjour,
Est-ce que C# 2.0 supporte l'héritage multiple de classes comme en c++ ??
(J'utilise Vs2005)
Si non y a t-il un moyen à part d'hériter chaque classe d'une classe ?
Merci d'avance

4 réponses

1 2
Avatar
Titeuf
Merci à Boris et à tout le monde
J'ai tout enregistré notamment sur les interfaces
Merci

"Boris Sargos" a écrit dans le message de news:
dmdefr$7t8$
Salut Titeuf,

si tu connais un peu les classes abstraites, une interface est une
"super classe abstraite". Il s'agit donc d'une "classe" qui ne possède
aucune donnée membre, mais uniquement des instructions destinées à ses
classes filles : ce sont les méthodes (et propriétés). Ainsi,
l'implémentation est totalement laissée aux héritiers.

Imagine que tu doives réaliser une bibliothèque d'algèbre linéaire pour
des clients. Eux te fournissent une classe Matrice, et toi tu leur
retournes les algorithmes.
Beaucoup d'implémentations sont possibles pour une classe Matrice. Les
données peuvent être stockées dans une collection, un tableau 2D, etc
... C'est le contexte qui fera choisir telle ou telle implémentation.
Ce que tu souhaites toi, dans ta librairie, c'est simplement pouvoir
additionner deux matrices, les multiplier, ou en récupérer les éléments.
Peu importe l'implémentation choisie par le client. Tu vas donc créer
une interface IMatrice, qui sera la base de toute implémentation de
classe Matrice. Cette interface aura comme méthode Addition,
Multiplication et Element. Chaque client qui utilisera ta librairie
devra créer une classe Matrice héritée de ton interface IMatrice.
L'avantage pour lui est qu'il l'implémente comme il le souhaite, suivant
ses propres contraintes, tant qu'il respecte les instructions Addition,
Multiplication et Element.

C'est clair ?

Donc en C++, l'équivalent d'une Interface est une classe virtuelle pure,
qui ne contient aucune donnée membre. Mais comme en C# on a interdit
l'héritage multiple de classes, il a fallu créer ce concept d'Interface
qui est vraiment efficace.

Voilà.


Avatar
Titeuf
Excuse moi,
Alors quand une classe hérite d'une interface on doit redéfinir les méthodes
de l'interface dans la classe?

"Boris Sargos" a écrit dans le message de news:
dmdefr$7t8$
Salut Titeuf,

si tu connais un peu les classes abstraites, une interface est une
"super classe abstraite". Il s'agit donc d'une "classe" qui ne possède
aucune donnée membre, mais uniquement des instructions destinées à ses
classes filles : ce sont les méthodes (et propriétés). Ainsi,
l'implémentation est totalement laissée aux héritiers.

Imagine que tu doives réaliser une bibliothèque d'algèbre linéaire pour
des clients. Eux te fournissent une classe Matrice, et toi tu leur
retournes les algorithmes.
Beaucoup d'implémentations sont possibles pour une classe Matrice. Les
données peuvent être stockées dans une collection, un tableau 2D, etc
... C'est le contexte qui fera choisir telle ou telle implémentation.
Ce que tu souhaites toi, dans ta librairie, c'est simplement pouvoir
additionner deux matrices, les multiplier, ou en récupérer les éléments.
Peu importe l'implémentation choisie par le client. Tu vas donc créer
une interface IMatrice, qui sera la base de toute implémentation de
classe Matrice. Cette interface aura comme méthode Addition,
Multiplication et Element. Chaque client qui utilisera ta librairie
devra créer une classe Matrice héritée de ton interface IMatrice.
L'avantage pour lui est qu'il l'implémente comme il le souhaite, suivant
ses propres contraintes, tant qu'il respecte les instructions Addition,
Multiplication et Element.

C'est clair ?

Donc en C++, l'équivalent d'une Interface est une classe virtuelle pure,
qui ne contient aucune donnée membre. Mais comme en C# on a interdit
l'héritage multiple de classes, il a fallu créer ce concept d'Interface
qui est vraiment efficace.

Voilà.


Avatar
Ambassadeur Kosh
> Excuse moi,
Alors quand une classe hérite d'une interface on doit redéfinir les
méthodes de l'interface dans la classe?



oui. jamais de code ni de variables membres dans une interface. et c'est ce
principe qui apporte enormement...
donc tu dois redefinir dans l'heritiere, quitte à dire que la fonction de
l'interface est abstract, mais tu declare ce que tu fais de toute façon.

interface ITest1
{
void f() ;
void z() ;
}

interface ITest2
{
void g() ;
int h(double n) ;
void z() ;
}

public abstract class Test : object, ITest1 , ITest2
{
// celle la, je la defini
public void f() { }
// celle la, je la rend abstract volontairement (c'est pas la
conséquence d'un oubli ou d'un ajout par qq'un dans l'interface)
public abstract void g() ;

// celle la, je la "recouvre"
public int ITest2.h(int n) { return h(n) ; }
public int h(int n) { return n+1 ; }

// celle la, elle est commune aux deux.
public void z() { }
}

en gros, tous ceux qui vont recevoir un objet designé comme Test verrons int
h(int). à l'interieur de test, h designera aussi int h(int).
par contre, celui qui verra un ITest2 aura dans sa ligne de mire un
h(double).

hope this help
Avatar
Titeuf
Merci merci......
c'est plus clair avec un exemple :)
1 2