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
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é.
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";
}
}
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;
}
};
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;
}
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";
}
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; }
}
- 1. Déclaration des Enums dans les classes dérivées
- 2. Sérialisation XML des classes dérivées
- 3. La duplication ennuyeuse dans les classes dérivées
- 4. SetUp dans les classes dérivées avec NUnit?
- 5. vtables pour les classes dérivées, concrètes,
- 6. Constantes statiques en C#
- 7. Refactorisation des méthodes dérivées des classes dérivées à la méthode de la classe de base commune? (C#)
- 8. Application d'un style à toutes les classes dérivées dans WPF
- 9. Pourquoi les classes dérivées n'ont-elles parfois que des types spécialisés dans les méthodes surchargées?
- 10. Héritage multiple de deux classes dérivées
- 11. surcharge [] [] dans C#
- 12. C# Gestion des exceptions dans les classes
- 13. Surcharge des méthodes STL C++
- 14. C#: Ajout des méthodes d'extension à une classe de base pour qu'ils apparaissent dans les classes dérivées
- 15. Existe-t-il un moyen de faire en sorte que les classes dérivées remplacent ToString()?
- 16. C Constantes
- 17. Modification des constantes pour les tests unitaires
- 18. L'événement non-abstrait défini dans la classe abstraite n'apparaîtra pas dans Designer pour les classes dérivées
- 19. Comment éviter de redéclater accidentellement les constantes globales en C++?
- 20. Comment configurer les constantes comme ceci - Constants.Page.Title.MyCase - en C#?
- 21. Mesure de la surcharge de gestion des exceptions en C++
- 22. Problèmes de pointeur avec surcharge en C++?
- 23. Méthode de surcharge avec les types C#
- 24. Où puis-je trouver des constantes de caractères en C#?
- 25. Utilisation de variables constantes dans les expressions Objective-C?
- 26. Recherche de méthodes dans des classes dérivées avec ActiveRecord - Single Table Inheritance
- 27. Surcharge d'un fichier existant en C#
- 28. problème de surcharge l'opérateur <en C++
- 29. opérateur Surcharge en C++ comme int + obj
- 30. Insertion Surcharge C Stream
Celui-ci serait un beau :) un – nayanajith