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

- [ #SharePoint 2016 ] frappe à nos portes ! (1/2) par Le blog de Patrick [MVP Office 365] le 04-19-2015, 23:21

- Lync devient Skype Entreprise par Le petit blog de Pierre / Pierre's little blog le 04-18-2015, 22:47

- [WCF] Prendre la main sur les protocoles par Blog de Jérémy Jeanson le 04-18-2015, 12:57

- yOS Tour Geneva - Retour des sessions par Blog Technique de Romelard Fabrice le 04-16-2015, 11:54

- YOS Genève 2015 : gestion des gros fichiers et plus … par The Mit's Blog le 04-13-2015, 11:56

- YOS Genève 2015 : App et bonnes pratiques par The Mit's Blog le 04-13-2015, 10:55

- [YOS Genève 2015] : Et si on adoptait enfin nos espaces collaboratifs par The Mit's Blog le 04-13-2015, 09:48

- [WCF] Les bases d’une configuration clean par Blog de Jérémy Jeanson le 04-11-2015, 11:48

- Dernière partie de cache cache avec l’AppFabric le 2/04/2016 par Blog de Jérémy Jeanson le 04-08-2015, 23:01

- [WCF] Binding REST et SSL, c’est possible par Blog de Jérémy Jeanson le 04-04-2015, 09:19