Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Méthode static virtuelle

20 réponses
Avatar
ShadowFil
Bonjour,

Est-il possible de rendre une méthode statique "virtuelle" pour qu'elle
puisse être surchargée dans les classes dérivée ?

Merci pour votre aide.

10 réponses

1 2
Avatar
Julien Bakmezdjian \(MS]
Bonjour,

Cela n'est pas possible à ma connaissance. Essayez d'ailleurs de compiler un
projet contenant cette classe :

class MaClasse1
{
public static virtual string SayHello()
{
return "Hello";
}
}

Cela devrait générer une erreur à la compilation.
Quel est votre besoin ?

Cordialement,

Julien Bakmezdjian


"ShadowFil" wrote in message
news:
Bonjour,

Est-il possible de rendre une méthode statique "virtuelle" pour qu'elle
puisse être surchargée dans les classes dérivée ?

Merci pour votre aide.


Avatar
Ambassadeur Kosh
non, jamais, et ça ne sert à rien

fais toi un objet, c'est pas pour le cout de l'instance...
l'exemple suivant est à rapprocher de la class Math.

abstract class MyMath
{
public abstract double Sqrt() ;

public static readonly MyMath Slow = new SlowImpl () ;
public static readonly MyMath Fast = new FastImpl () ;

private sealed class SlowImpl : MyMath
{
public override double Sqrt() { ... }
}
private sealed class FastImpl : MyMath
{
public override double Sqrt() { ... }
}
}


et si dans une classe, tu veux abstraire le calcul, y'a plusieurs façons de
faire...

void f(MyMath math)
{
double d = math.Sqrt(25.89) ;
}


private MyMath math ;
void f()
{
double d = math.Sqrt(25.89) ;
}

private static MyMath math ;
void f()
{
double d = math.Sqrt(25.89) ;
}
Avatar
ShadowFil
Je voudrais redéfinir une méthode statique que j'ai hérité de la classe dont
j'hérite.

Logiquement, il devrait être possible de surcharger des méthodes statiques
au même titre que des méthodes d'instances. La méthode statique surchargée
proposerait un nouveau traitement à toutes les instances de la classe dérivée.
Avatar
Ambassadeur Kosh
> Je voudrais redéfinir une méthode statique que j'ai hérité de la classe
dont
j'hérite.



ok

Logiquement, il devrait être possible de surcharger des méthodes statiques
au même titre que des méthodes d'instances.



non, ça n'est pas (encore) logique

La méthode statique surchargée
proposerait un nouveau traitement à toutes les instances de la classe
dérivée.



tiens, le mot instance :)
Avatar
Simon Mourier
On ne peut pas surcharger (virtual/override) la méthode mais on peut la
redéfinir (new)

public class Toto
{
public static void Titi()
{
// tralala
}
}

public class Toto2: Toto
{
public static new void Titi()
{
// tsoin-tsoin
}
}


Simon.
www.softfluent.com


"ShadowFil" a écrit dans le message de
news:
Je voudrais redéfinir une méthode statique que j'ai hérité de la classe
dont
j'hérite.

Logiquement, il devrait être possible de surcharger des méthodes statiques
au même titre que des méthodes d'instances. La méthode statique surchargée
proposerait un nouveau traitement à toutes les instances de la classe
dérivée.


Avatar
ShadowFil
Désolé, mais je n'arrive pas à comprendre pourquoi il ne serait pas possible
de créer une méthode statique virtuelle. Car le polymorphisme est lié à
l'héritage, pas aux instances.

La méthode statique de la classe parent est accessible à toutes les
instances de la classe parent et à toutes les instances des classes dérivées.

Une classe dérivée pourrait donc surcharger la méthode statique de la classe
parent pour proposer du code plus spécifique. Cette méthode statique serait
donc accessible à toutes les instances de cette classe dérivée et toutes les
instances des classes dérivées de cette classe.
Avatar
Julien Bakmezdjian \(MS]
Bonjour,

En fait, on n'accède pas à la méthode statique (toute unique soit elle) par
l'instance, mais par la classe elle-même. Une méthode statique est chargée
en mémoire avant même toute instanciation. MaClasse.MaMéthodeStatique
marche, mais pas MonObject.MaMéthodeStatique.
Lors de l'héritage, le code de la méthode statique n'est pas recopié dans la
classe héritière... La classe héritière va juste utiliser le même code
chargé par la classe parente. Il n'est pas prévu que l'on puisse changer
cela et de réécrire la méthode.

Julien Bakmezdjian

"ShadowFil" wrote in message
news:
Désolé, mais je n'arrive pas à comprendre pourquoi il ne serait pas
possible
de créer une méthode statique virtuelle. Car le polymorphisme est lié à
l'héritage, pas aux instances.

La méthode statique de la classe parent est accessible à toutes les
instances de la classe parent et à toutes les instances des classes
dérivées.

Une classe dérivée pourrait donc surcharger la méthode statique de la
classe
parent pour proposer du code plus spécifique. Cette méthode statique
serait
donc accessible à toutes les instances de cette classe dérivée et toutes
les
instances des classes dérivées de cette classe.



Avatar
Ambassadeur Kosh
ok, je vois bien ce que tu essayes de faire. mais pas comme ça. utilise un
pattern plus approprié. la class que je t'ai filé en exemple va répondre
exactement à ce que tu cherches à faire. à l'image de static, la class
MyMath ne verra pas les données de la class dans laquelle elle est utilisée,
et la "variabilité" s'obitent par l'instance choisie...

faudra attendre un peu pour avoir du lambda calcul :)
Avatar
Arnaud Debaene
ShadowFil wrote:
Désolé, mais je n'arrive pas à comprendre pourquoi il ne serait pas
possible de créer une méthode statique virtuelle.


Avec les méthodes virtuelles, ce qui définit la fonction réellement appelée,
c'est le type concret (type le plus dérivé) de *l'instance* (càd l'objet,
créé avec new) sur laquelle la méthode appelée. Avec une foncrtion statique,
il n'y a pas d'instance sur laquelle la fonction est appelée, donc la noion
de fonction virtuelle n'a plus de sens.

Car le
polymorphisme est lié à l'héritage, pas aux instances.


Le polymorphisme est lié au type concret de l'instance sur laquelle on
appelle la méthode...

Arnaud
MVP - VC
Avatar
ShadowFil
"Arnaud Debaene" a écrit :
Avec les méthodes virtuelles, ce qui définit la fonction réellement appelée,
c'est le type concret (type le plus dérivé) de *l'instance* (càd l'objet,
créé avec new) sur laquelle la méthode appelée. Avec une foncrtion statique,
il n'y a pas d'instance sur laquelle la fonction est appelée, donc la noion
de fonction virtuelle n'a plus de sens.



Oui. Donc, tu peux appeler une méthode statique du type d'une classe
dérivée, qui aurait pu (si c'était possible) surcharger la méthode statique
du type de sa classe de base. En fonction du type utiliser, on aurait pu
accéder à la méthode statique du type le plus dérivé.
1 2