override static
Cela fait longtemps que je dis que ça manque. Et bien c'est pas demain la veille que ça va changer. 
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
).
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
), 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 :