OVH Cloud OVH Cloud

heritage

8 réponses
Avatar
Mathieu Chavoutier
Bonjour.

J'ai une classe virtuelle :

public abstract class MyClass
{
}

Et une classe fille, qui, forcément, hérite de sa mère :

public class MyFille : Myclass
{
}

1: Dans la classe mère, je suis obligé de mettre un constructeur, parce que
sinon, le compilateur est pas content. Pourtant, je voudrais m'assurer que
personne n'utilise la classe mère toute seule. Elle n'existe que pour ses
filles.

2: Par contre, j'ai beaucoup de filles qui ont des fonctions semblables :
int myPorteMonnaie(). Je voudrais donc que la mère ait cette fonction
implémentée, et que les filles en hérite, et que celle qui est pas d'accord
la redéfinisse. Mais, comme la mère est virtuelle pure, ça marche pas comme
ça. Donc, y-a-t'il un moyen que j'ai pas vu ? Où dois-je refaire un héritage
non virtuel qui servirait juste aux filles pareil, qui hériteraient juste de
cette classe temporaire ?

Je vous remercie de toute réponse.

8 réponses

Avatar
Hervé
Bonjour,

Pour le premier problème,il se pourrait que tu t'en sortes avec un
constructeur privé ?

Pour l'autre problème, as-tu essayé qqch comme :

public abstract class MyClass
{

public virtual int MyPorteMonnaie() {...}
}

public class MyFille : MyClass
{
public override int MyPorteMonnaie() {...}
}

"Mathieu Chavoutier" a écrit dans le message de
news:
Bonjour.

J'ai une classe virtuelle :

public abstract class MyClass
{
}

Et une classe fille, qui, forcément, hérite de sa mère :

public class MyFille : Myclass
{
}

1: Dans la classe mère, je suis obligé de mettre un constructeur, parce


que
sinon, le compilateur est pas content. Pourtant, je voudrais m'assurer que
personne n'utilise la classe mère toute seule. Elle n'existe que pour ses
filles.

2: Par contre, j'ai beaucoup de filles qui ont des fonctions semblables :
int myPorteMonnaie(). Je voudrais donc que la mère ait cette fonction
implémentée, et que les filles en hérite, et que celle qui est pas


d'accord
la redéfinisse. Mais, comme la mère est virtuelle pure, ça marche pas


comme
ça. Donc, y-a-t'il un moyen que j'ai pas vu ? Où dois-je refaire un


héritage
non virtuel qui servirait juste aux filles pareil, qui hériteraient juste


de
cette classe temporaire ?

Je vous remercie de toute réponse.




Avatar
Mathieu Chavoutier
"Hervé" a écrit dans le message de
news:40f2b31e$0$24452$
Bonjour,

Pour le premier problème,il se pourrait que tu t'en sortes avec un
constructeur privé ?



Je viens de tester, et il me dit :

'zouip.MyClass()' est inaccessible en raison de son niveau de protection

Pour l'autre problème, as-tu essayé qqch comme :

public abstract class MyClass
{

public virtual int MyPorteMonnaie() {...}
}

public class MyFille : MyClass
{
public override int MyPorteMonnaie() {...}
}



Ca marche, merci :o)
Avatar
Hervé
Bonjour.

1: Dans la classe mère, je suis obligé de mettre un constructeur, parce



que

sinon, le compilateur est pas content. Pourtant, je voudrais m'assurer que
personne n'utilise la classe mère toute seule. Elle n'existe que pour ses
filles.





> Pour le premier problème,il se pourrait que tu t'en sortes avec un
> constructeur privé ?

Un constructeur protected plutôt, afin que les classes filles puissent
l'appeler...

Hervé
Avatar
Zazar
Bonsoir,

Un constructeur protected plutôt, afin que les classes filles puissent
l'appeler...



Malheuresement, un constructeur protected n'empêche pas l'utlisation de la
classe mère directement.
Un exemple :

public class MyClass1 {
protected MyClass1() {
}
}

public class MyClass2 : MyClass1 {
public static MyClass1() {
return new MyClass1();
}
}

Heureusement cette horrible magouille ne devrait plus être possible avec la
version 2.0 du framework.

--
Zazar
Avatar
Zazar
Bonsoir,

J'ai une classe virtuelle :

public abstract class MyClass
{
}

Et une classe fille, qui, forcément, hérite de sa mère :

public class MyFille : Myclass
{
}

1: Dans la classe mère, je suis obligé de mettre un constructeur, parce


que
sinon, le compilateur est pas content. Pourtant, je voudrais m'assurer que
personne n'utilise la classe mère toute seule. Elle n'existe que pour ses
filles.



Vous avez déclaré votre classe comme étant abstraite, cela suffit.

2: Par contre, j'ai beaucoup de filles qui ont des fonctions semblables :
int myPorteMonnaie(). Je voudrais donc que la mère ait cette fonction
implémentée, et que les filles en hérite, et que celle qui est pas


d'accord
la redéfinisse. Mais, comme la mère est virtuelle pure, ça marche pas


comme

Une classe virtuelle pure, c'est une interface. Là votre classe est
"seulement" abstraite.

ça. Donc, y-a-t'il un moyen que j'ai pas vu ? Où dois-je refaire un


héritage
non virtuel qui servirait juste aux filles pareil, qui hériteraient juste


de
cette classe temporaire ?



La réponse d'Hervé est la bonne.

--
Zazar
Avatar
David Rousset [MS]
Bonjour,

Le mot clé "abstract" indique que votre classe est abstraite. Donc, elle
ne pourra pas être instanciée directement par du code.

Pour votre question 1, la mise en place d'un constructeur ne pose donc
pas de problème puisque personne ne pourra l'appeler directement.
D'ailleurs, vous pouvez faire le test en essayant instancier votre classe
abstraite : à la compilation vous aurez bien une erreur vous indiquant que
cela n'est pas possible.

Pour votre deuxième question, il vous suffit de mettre la méthode au
niveau de la classe mère abstraite en "virtual" pour qu'elle puisse être
éventuellement redéfinie plus tard. En effet, rien n'empêche de mettre des
méthodes non abstraites dans une classe abstraite.

Pour conclure, vous aurez donc un code semblable à

public abstract class MyClass
{
public MyClass(){}
virtual protected int myPorteMonnaie()
{
return 1;
}
}

public class AutreClass : MyClass
{
}

Ensuite, vous pourrez instancier vos 2 classes de la manière suivante :

//MyClass toto = new MyClass();
MyClass titi = new AutreClass();
AutreClass tata = new AutreClass();

Vous noterez que la première ligne en commentaire génère bien une erreur
de compilation, ce qui est normal. Par contre, rien ne m'empêche instancier
un objet de type AutreClass et de l'affecter dans une référence de type
MyClass car je n'instancie pas dans ce cas d'objet MyClass directement mais
bien une classe dérivée.

Voilà, j'espère avoir éclairé un petit peu tout ça. :)

Bye,
--
David Rousset
Microsoft France
--------------------
Merci de bien vouloir répondre à ce message dans le newsgroup où il a été
posté. Je le consulte régulièrement.

"Mathieu Chavoutier" a écrit dans le message de news:

Bonjour.

J'ai une classe virtuelle :

public abstract class MyClass
{
}

Et une classe fille, qui, forcément, hérite de sa mère :

public class MyFille : Myclass
{
}

1: Dans la classe mère, je suis obligé de mettre un constructeur, parce
que
sinon, le compilateur est pas content. Pourtant, je voudrais m'assurer que
personne n'utilise la classe mère toute seule. Elle n'existe que pour ses
filles.

2: Par contre, j'ai beaucoup de filles qui ont des fonctions semblables :
int myPorteMonnaie(). Je voudrais donc que la mère ait cette fonction
implémentée, et que les filles en hérite, et que celle qui est pas
d'accord
la redéfinisse. Mais, comme la mère est virtuelle pure, ça marche pas
comme
ça. Donc, y-a-t'il un moyen que j'ai pas vu ? Où dois-je refaire un
héritage
non virtuel qui servirait juste aux filles pareil, qui hériteraient juste
de
cette classe temporaire ?

Je vous remercie de toute réponse.




Avatar
Mathieu Chavoutier
"Zazar" a écrit dans le message
de news:u1e%

Vous avez déclaré votre classe comme étant abstraite, cela suffit.



D'accord.

> 2: Par contre, j'ai beaucoup de filles qui ont des fonctions semblables


:
> int myPorteMonnaie(). Je voudrais donc que la mère ait cette fonction
> implémentée, et que les filles en hérite, et que celle qui est pas
d'accord
> la redéfinisse. Mais, comme la mère est virtuelle pure, ça marche pas
comme

Une classe virtuelle pure, c'est une interface. Là votre classe est
"seulement" abstraite.



Je ne suis pas d'accord, la par contre. Une interface est une interface.
Une classe virtuelle pure est une classe qu'on ne peut pas instancier.
Apres, il faut adapter les definitions au langage, et non l'inverse ;o)

> ça. Donc, y-a-t'il un moyen que j'ai pas vu ? Où dois-je refaire un
héritage
> non virtuel qui servirait juste aux filles pareil, qui hériteraient


juste
de
> cette classe temporaire ?

La réponse d'Hervé est la bonne.



Oui, merci :o)
Avatar
Mathieu Chavoutier
"David Rousset [MS]" a écrit dans le message
de news:O%
Bonjour,

Le mot clé "abstract" indique que votre classe est abstraite. Donc,


elle
ne pourra pas être instanciée directement par du code.



D'accord, merci :o)

Pour votre question 1, la mise en place d'un constructeur ne pose donc
pas de problème puisque personne ne pourra l'appeler directement.
D'ailleurs, vous pouvez faire le test en essayant instancier votre classe
abstraite : à la compilation vous aurez bien une erreur vous indiquant que
cela n'est pas possible.



Effectivement, j'aurais du tester avant de poster, je m'en excuse.

Pour votre deuxième question, il vous suffit de mettre la méthode au
niveau de la classe mère abstraite en "virtual" pour qu'elle puisse être
éventuellement redéfinie plus tard. En effet, rien n'empêche de mettre des
méthodes non abstraites dans une classe abstraite.



Oui, merci.

Pour conclure, vous aurez donc un code semblable à

public abstract class MyClass
{
public MyClass(){}
virtual protected int myPorteMonnaie()
{
return 1;
}
}

public class AutreClass : MyClass
{
}

Ensuite, vous pourrez instancier vos 2 classes de la manière suivante :

//MyClass toto = new MyClass();
MyClass titi = new AutreClass();
AutreClass tata = new AutreClass();

Vous noterez que la première ligne en commentaire génère bien une erreur
de compilation, ce qui est normal.



Et recherché :o)

Par contre, rien ne m'empêche instancier
un objet de type AutreClass et de l'affecter dans une référence de type
MyClass car je n'instancie pas dans ce cas d'objet MyClass directement


mais
bien une classe dérivée.



C'est un peu pour cela que j'utilise de l'héritage :o)

Voilà, j'espère avoir éclairé un petit peu tout ça. :)



Je vous remercie :o)