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

- Configurer un écran 5 pouces 800x480 pour Raspberry Pi2 sous Windows 10 IOT par Blog de Daniel TIZON [daniel] le 05-22-2015, 07:52

- Office 365 : Sway est disponible en preview par Le petit blog de Pierre / Pierre's little blog le 05-21-2015, 22:24

- Première installation de Raspbian sur RASPBERRY Pi 2 par Blog de Daniel TIZON [daniel] le 05-14-2015, 22:17

- Mobile Day : c’est le 25 et c’est chez Microsoft! par Fathi Bellahcene le 05-13-2015, 23:48

- TFS 2013 : Migration d’une ferme TFS 2010 vers 2013 sans upgrade par Blog Technique de Romelard Fabrice le 05-01-2015, 16:28

- [ #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