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

- Merci par Blog de Jérémy Jeanson le 10-01-2019, 20:47

- Office 365: Script PowerShell pour auditer l’usage des Office Groups de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 11:02

- Office 365: Script PowerShell pour auditer l’usage de Microsoft Teams de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 10:39

- Office 365: Script PowerShell pour auditer l’usage de OneDrive for Business de votre tenant par Blog Technique de Romelard Fabrice le 04-25-2019, 15:13

- Office 365: Script PowerShell pour auditer l’usage de SharePoint Online de votre tenant par Blog Technique de Romelard Fabrice le 02-27-2019, 13:39

- Office 365: Script PowerShell pour auditer l’usage d’Exchange Online de votre tenant par Blog Technique de Romelard Fabrice le 02-25-2019, 15:07

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Stream Portal par Blog Technique de Romelard Fabrice le 02-21-2019, 17:56

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Video Portal par Blog Technique de Romelard Fabrice le 02-18-2019, 18:56

- Office 365: Script PowerShell pour extraire les Audit Log basés sur des filtres fournis par Blog Technique de Romelard Fabrice le 01-28-2019, 16:13

- SharePoint Online: Script PowerShell pour désactiver l’Option IRM des sites SPO non autorisés par Blog Technique de Romelard Fabrice le 12-14-2018, 13:01