2009-04-20 11 views
27

En C#, peut-on remplacer une constante dans une classe dérivée? J'ai un groupe de classes qui sont toutes les mêmes avec des valeurs constantes, donc je voudrais créer une classe de base qui définit toutes les méthodes et ensuite simplement définir les constantes pertinentes dans les classes dérivées. Est-ce possible? Je préférerais ne pas simplement transmettre ces valeurs au constructeur de chaque objet, car je souhaiterais ajouter la sécurité de type de plusieurs classes (puisque cela n'a jamais de sens d'interagir entre deux objets avec des constantes différentes).Surcharge des constantes dans les classes dérivées en C#

Répondre

29

Malheureusement, les constantes ne peuvent pas être remplacées car elles ne sont pas des membres virtuels. Les identifiants constants dans votre code sont remplacés par leurs valeurs littérales par le compilateur au moment de la compilation.

Je vous suggère d'essayer d'utiliser une propriété abstraite ou virtuelle pour ce que vous aimeriez faire. Ceux-ci sont virtuels et en tant que tels peuvent (doivent, dans le cas d'une propriété abstraite) être remplacés dans le type dérivé.

44

ce n'est pas une constante si vous voulez la remplacer;) essayez une propriété en lecture seule virtuelle (ou poseur protégé) ...

en lecture seule propriété

public class MyClass { 
    public virtual string MyConst { get {return "SOMETHING"; }} 
} 
... 
public class MyDerived : MyClass { 
    public override string MyConst { get { return "SOMETHINGELSE"; }} 
}

protégé Setter

public class MyClass { 
    public string MyConst { get; protected set; } 

    public MyClass() { 
     MyConst = "SOMETHING"; 
    } 
} 

public class MyDerived : MyClass { 
    public MyDerived() { 
     MyConst = "SOMETHING ELSE"; 
    } 
}
3

Les constantes marquées avec const ne peuvent pas être remplacées par le compilateur au moment de la compilation.

Mais les champs statiques réguliers affectés aux valeurs constantes peuvent. J'ai eu un tel cas, tout à l'heure:

class Columns 
    { 
     public static int MaxFactCell = 7; 
    }; 

    class Columns2 : Columns 
    { 
     static Columns2() 
     { 
      MaxFactCell = 13; 
     } 
    }; 

Si je viens champ MaxFactCell redéfini dans la classe dérivée au lieu, le polymorphisme ne fonctionnerait pas: code à l'aide Columns2 comme Columns ne verrait pas la valeur primordiale.

Si vous devez restreindre l'accès en écriture (mais pas en lecture) au champ, l'utilisation de readonly empêcherait de le redéfinir en Columns2. Faites-en une propriété au lieu, qui est un peu plus code:

class Columns 
    { 
     static Columns() 
     { 
      MaxFactCell = 7; 
     }    
     public static int MaxFactCell {get; protected set;}; 
    }; 

    class Columns2 : Columns 
    { 
     static Columns2() 
     { 
      MaxFactCell = 13; 
     } 
    }; 
1

Vous pouvez cacher la constante héritée dans une classe dérivée en déclarant la nouvelle new constante. Je ne suis pas sûr que ce soit une bonne pratique, cependant.

class A 
{ 
    protected const int MyConst = 1; 
} 

class B : A 
{ 
    new private const int MyConst = 2; 
} 
+0

Celui-ci serait un beau :) un – nayanajith

1

de travailler en dehors DTEN + réponse de Tracker1 mais mis à jour pour C# 6

public class MyClass { 
    public virtual string MyConst =>"SOMETHING"; 
} 
... 
public class MyDerived : MyClass { 
    public override string MyConst =>"SOMETHING ELSE"; 
} 
0

Vous pouvez forcer les classes dérivées d'avoir une valeur pour une constante (bien, une propriété en lecture seule)

  • Créer une interface contenant une propriété en lecture seule.
  • Mettez cette interface sur la classe de base.

Exemple:

public interface IHasConstant 
    { 
     string MyConst { get; } 
    } 
Questions connexes