Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Abonnements

override static

Cela fait longtemps que je dis que ça manque. Et bien c'est pas demain la veille que ça va changer. Sad

Cependant, Kirill Osenkov nous explique comment s'en passer (on a l'impression d'être à la fin de la vidéo sur la vie à Microsoft Big Smile).

La première solution est très naturelle (c'est d'ailleurs celle que j'utilise généralement). Elle consiste à utiliser les design patterns Strategy et Singleton.

La seconde consiste à utiliser les delegates.

Cependant, cela ne change rien au problème : à mon avis, il est dommage de ne pas pouvoir avoir de static override.

Comme je suis un peu con quand il s'agit de conception OO (je sais pas que dans ce cas là mais c'est pas la peine de me mettre un commentaire pour ça Wink), je préfère que ce soit la classe qui définit le singleton qui gère son instance. Aussi, il m'arrive également d'utiliser une solution assez proche de la première proposée par Kirill Osenkov.

Imaginons que l'on veuille faire cela :

static class C1

{

    public static void WriteLine()

    {

        Console.WriteLine(Line);

    }

    protected static virtual string Line

    {

        get { return "C1"; }

    }

}

 

static class C2 : C1

{

    protected static override string Line

    {

        get { return "C2"; }

    }

}

Pour cela, on peut utiliser le code suivant :

abstract class BaseStaticOverride<T> where T : BaseStaticOverride<T>

{

    private static T _instance;

    private static object _lock = new object();

 

    public static T Instance

    {

        get

        {

            if (_instance == null)

            {

                lock (_lock)

                {

                    if (_instance == null)

                        _instance = (T)Activator.CreateInstance(typeof(T), true);

                }

            }

            return _instance;

        }

    }

}

abstract class C1Base<T> : BaseStaticOverride<T> where T : C1Base<T>

{

    protected C1Base()

    {

    }

 

    public void WriteLine()

    {

        Console.WriteLine(Line);

    }

    protected abstract string Line

    {

        get;

    }

}

class C1 : C1Base<C1>

{

    private C1()

    {

    }

 

    protected override string Line

    {

        get { return "C1"; }

    }

}

class C2 : C1Base<C2>

{

    private C2()

    {

    }

 

    protected override string Line

    {

        get { return "C2"; }

    }

}

Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :

Publié mercredi 20 février 2008 21:26 par Matthieu MEZIL

Classé sous : , ,

Commentaires

# re: override static @ jeudi 21 février 2008 11:20

C'est vrai que des fois on se dit que ca manque, mais quand on réfléchis bien, ca n'a pas de sens, immagine: une classe Mere et deux classes Fille1 et Fille2 qui dérivent de Mere et qui overrident chacune la meme méthode Foo.

Quelle méthode est-ce que tu appelles quand tu fait Mere.Foo() ? Fille1.Foo() ou Fille2.Foo() ?

RaptorXP

# re: override static @ jeudi 21 février 2008 14:57

Effectivement le static abstract poserait problème mais pas le static virtual/override.

Matthieu MEZIL

# re: override static @ jeudi 21 février 2008 15:59

Ben si, le probleme est le meme. Quand tu overrides une methode dans Fille, peu importe si la methode dans la classe de base est abstract ou virtual, dans les deux cas, c'est la methode de la fille qui doit etre appellee.

RaptorXP

# re: override static @ vendredi 22 février 2008 09:10

Non je ne suis pas d'accord avec toi.
"Quand tu overrides une methode dans Fille, peu importe si la methode dans la classe de base est abstract ou virtual, dans les deux cas, c'est la methode de la fille qui doit etre appellee."
Je n'ai pas d'instance, on parle de méthode static. Par conséquent, quand je fais Mere.Foo(), c'est la méthode Foo de Mere qui doit être appelée.


Le cas où je trouve que le static override serait bien pratique, c'est dans le cas du design pattern Patron de méthodes. Ainsi, mon code est factorisé, plus propre, plus facilement maintenable, etc.
Typiquement dans ce cas là :

static class C1
{
   public static void WriteLine()
   {
       Console.WriteLine(Line);
   }
   protected static virtual string Line
   {
       get { return "C1"; }
   }
}
static class C2 : C1
{
   protected static override string Line
   {
       get { return "C2"; }
   }
}

Je veux que C1.WriteLine() affiche "C1" et que C2.WriteLine() affiche "C2".

Matthieu MEZIL

Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- L’application des MiniDrones Parrot est aussi disponible pour Windows 8.1 par Blog de Jérémy Jeanson le 10-28-2014, 15:01

- L’application des MiniDrones Parrot est enfin disponible pour Windows Phone par Blog de Jérémy Jeanson le 10-27-2014, 09:49

- Mise à jour Samsung 840 EVO sur core server par Blog de Jérémy Jeanson le 10-27-2014, 05:59

- MVP Award 2014 ;) par Blog de Jérémy Jeanson le 10-27-2014, 05:42

- « Naviguer vers le haut » dans une librairie SharePoint par Blog de Jérémy Jeanson le 10-07-2014, 13:21

- PowerShell: Comment mixer NAGIOS et PowerShell pour le monitoring applicatif par Blog Technique de Romelard Fabrice le 10-07-2014, 11:43

- ReBUILD 2014 : les présentations par Le blog de Patrick [MVP Office 365] le 10-06-2014, 09:15

- II6 Management Compatibility présente dans Windows Server Technical Preview avec IIS8 par Blog de Jérémy Jeanson le 10-05-2014, 17:37

- Soft Restart sur Windows Server Technical Preview par Blog de Jérémy Jeanson le 10-03-2014, 19:43

- Non, le certificat public du CA n’est pas un certificat client !!! par Blog de Jérémy Jeanson le 10-03-2014, 00:08