Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Matthieu MEZIL

I love .Net

Abonnements

Actualités

Locations of visitors to this page English blog
Locations of visitors to this blog
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

- Un outil pour réaliser des animations WPF basées sur des équations de Bézier par Perspective le il y a 3 heures et 18 minutes

- Sandcastle et CodePlex : le verdict par CoqBlog le il y a 4 heures et 9 minutes

- Webcasts sur le Parallel Framework disponibles par Matthieu MEZIL le il y a 7 heures et 37 minutes

- [Silverlight] - Comprendre et Débuter avec Silverlight par Danuz le il y a 12 heures et 22 minutes

- SharePoint : Nouvel article sur l'exportation et Importation de sites SharePoint par Blog Technique de Romelard Fabrice le 07-04-2008, 01:00

- ImagineCup 2008 Final in Paris: Day 1 par Richard Clark le 07-03-2008, 22:48

- PowerShell : Comment utiliser un ENUM .NET dans un script PowerShell par Blog Technique de Romelard Fabrice le 07-03-2008, 18:09

- OU SONT LES VISITEURS DE MON SITE ? par Nix's Blog le 07-03-2008, 15:07

- PowerShell : Quelques outils de développement adaptés par Blog Technique de Romelard Fabrice le 07-03-2008, 14:50

- [DevWeb] "FireFox est lent quand je developpe en local ?" par The diary of EBArtSoft le 07-03-2008, 14:47