Concrêtement ? Réutiliser une classe (par exemple je veux me faire un contrôle personnalisé) et changer l'implémentation d'une méthode...
Je fais un contrôle MonButtonAmélioré
celui qui considère que c'est un bouton de base, il aura accès aux méthodes comme si c'était un bouton, la classe bouton n'ayant pas autorisé la virtualisation, l'utilisateur n'est pas perdu. L'utilisateur qui considère que c'est une instance de MonButtonAmélioré appelera ma méthode qui fait des trucs en plus, et là il saura à quoi s'attendre puisque c'est lui qui a demandé explicitement une référence vers cette sous-classe.
En gros je crois qu'il faut voir celà comme ca :
1 - tu peux toujours redéfinir une méthode dans une classe qui hérite d'une autre
2 - soit la classe mère veut que ce soit la classe fille qui définisse une méthode précise, auquelle cas le développeur la met virtual. Sinon dans tous les autres cas le comportement ne change pas, il faut que le développeur fasse une référence explicite au type exacte de la classe pour obtenir le comportement différent si c'est une classe hérité avec une méthode new.
On retrouve le même principe pour les interfaces :
class A : InterfaceB {
interfaceB.methode(){
}
}
là il faut utiliser explicitement une référence à l'intefaceB (par exemple (new A() as InterfaceB).methode(); ) pour pouvoir en utiliser une méthode.
Je trouve à la limite ce comportement plus cohérent pour l'utilisateur...
Imagines le cas suivant :
class Véhicule{
private nom = "voiture" //ca pourrait évoluer
public ToString(){
Console.WriteLine(nom);
}
}
class Mercedes : Véhicule{
public new ToString(){
Console.WriteLine("Mercedes Class A");
}
}
Maitenant on prend toujours le cas où c'est la Mercedes qui est instanciée, mais la référence est pas la même.
Je veux lister mes véhicules pour aovir leur types :
j'obtiendrai en C# quelque chose comme ca en utilisant que des références de
Véhicule :
voiture
camion
voiture
4x4
en Java il obtiendrait celà :
voiture
Mercedes Class A
camion
Ford Focus 1.4l
Bref le new est là pour ne pas brider le développeur qui a besoin d'un nom particulier, mais lui empêche tout de même de changer le comportement qui peut être attendu par l'utlisateur qui ne s'attend peut être pas à une redéfinission de la méthode. C'est celui qui développe la super classe qui décide de mettre virtual ou pas.
[^] # Re: C'est un troll.
Posté par TImaniac (site web personnel) . En réponse à la dépêche Mono 1.0 sous le feu des projecteurs. Évalué à 2.
Je fais un contrôle MonButtonAmélioré
celui qui considère que c'est un bouton de base, il aura accès aux méthodes comme si c'était un bouton, la classe bouton n'ayant pas autorisé la virtualisation, l'utilisateur n'est pas perdu. L'utilisateur qui considère que c'est une instance de MonButtonAmélioré appelera ma méthode qui fait des trucs en plus, et là il saura à quoi s'attendre puisque c'est lui qui a demandé explicitement une référence vers cette sous-classe.
En gros je crois qu'il faut voir celà comme ca :
1 - tu peux toujours redéfinir une méthode dans une classe qui hérite d'une autre
2 - soit la classe mère veut que ce soit la classe fille qui définisse une méthode précise, auquelle cas le développeur la met virtual. Sinon dans tous les autres cas le comportement ne change pas, il faut que le développeur fasse une référence explicite au type exacte de la classe pour obtenir le comportement différent si c'est une classe hérité avec une méthode new.
On retrouve le même principe pour les interfaces :
class A : InterfaceB {
interfaceB.methode(){
}
}
là il faut utiliser explicitement une référence à l'intefaceB (par exemple (new A() as InterfaceB).methode(); ) pour pouvoir en utiliser une méthode.
Je trouve à la limite ce comportement plus cohérent pour l'utilisateur...
Imagines le cas suivant :
class Véhicule{
private nom = "voiture" //ca pourrait évoluer
public ToString(){
Console.WriteLine(nom);
}
}
class Mercedes : Véhicule{
public new ToString(){
Console.WriteLine("Mercedes Class A");
}
}
Maitenant on prend toujours le cas où c'est la Mercedes qui est instanciée, mais la référence est pas la même.
Je veux lister mes véhicules pour aovir leur types :
j'obtiendrai en C# quelque chose comme ca en utilisant que des références de
Véhicule :
voiture
camion
voiture
4x4
en Java il obtiendrait celà :
voiture
Mercedes Class A
camion
Ford Focus 1.4l
Bref le new est là pour ne pas brider le développeur qui a besoin d'un nom particulier, mais lui empêche tout de même de changer le comportement qui peut être attendu par l'utlisateur qui ne s'attend peut être pas à une redéfinission de la méthode. C'est celui qui développe la super classe qui décide de mettre virtual ou pas.