sans aucun code dans les sous-classes em>, j'aimerais qu'une classe abstraite ait une copie différente d'une variable statique pour chaque sous-classe. En C # et (par exemple): p> Ma solution actuelle est la suivante: p> Bien que cela fonctionne bien, je me demande s'il y a une manière plus élégante ou intégrée de faire cela? P> Ceci est similaire à puis-je avoir des copies différentes d'une variable statique pour chaque type de classe de héritage A >, mais je n'ai aucun contrôle sur les sous-classes em> p> p>
6 Réponses :
Bien que cela fonctionne bien, je me demande s'il y a une façon plus élégante ou intégrée de faire cela? P> blockQuote>
Il n'y a pas vraiment de manière intégrée de le faire, car vous avez une sorte de violation des principes de base OO ici. Votre classe de base ne devrait avoir aucune connaissance des sous-classes dans la théorie traditionnelle orientée objet. P>
Cela étant dit, si vous devez le faire, votre implémentation est probablement aussi bonne que vous allez obtenir, à moins que vous ne puissiez ajouter d'autres informations aux sous-classes directement. Si vous devez contrôler cela, et vous ne pouvez pas changer de sous-classes, ce sera probablement votre meilleure approche. P>
Pour ceux qui trébuchent sur cela, assurez-vous de voir la réponse de @ Jimbob ci-dessous.
Il y a une solution alternative qui pourrait être meilleure ou non meilleure que la tienne, en fonction du cas d'utilisation: Cette approche est utilisée dans Equalitalcander
getvalue code> abstrait et le remplacer dans chaque classe dérivée. P> p>
@ Enorl76 Cette question est très ancienne, donc je ne me souviens pas du contexte réel, mais je ne pense pas que cette approche nécessite une getvalue primordiale. La dernière phrase de ma réponse n'est qu'un commentaire sur la bonne approche, pas une partie de la solution.
C'est un peu différent de ce que vous demandez, mais peut-être accomplir la même chose.
C'est l'évidence + meilleur moyen - malheureusement je ne peux pas modifier les classes B & C
Et cela? Cela fonctionne pour moi.
Serait encore plus agréable avec une interface. P> p>
Soins Pour expliquer ce que le code fait pour le bénéfice des autres, un décharge de code sans explication ne satisfera pas si les utilisateurs :)
Non, cela ne fonctionnerait jamais. Selon le moment où le VM voit les types, c'est-à-dire lorsque le constructeur statique serait appelé, et donc «myvariable» contiendra la valeur de la dernière constructeur de la statique. Et encore pire, ça va être indéterminé à qui ce dernier constructeur sera.
Il y a un moyen plus élégant. Vous pouvez exploiter le fait que la statique dans une classe de base générique est différente pour chaque classe dérivée d'un type différent de type pour chaque classe enfant, la statique int x sera unique pour chaque T
Permet de dériver deux classes d'enfants et nous utilisons le nom de la classe enfant comme le t générique T dans la classe de base. P> MAINTATIC MYPROPERTY est unique pour les enfants et l'enfant p>
Non, c'est juste faux. TA et TB MyProperty auraient tous les deux 4 ans maintenant.
@Thesoftwarejedi. Tort? Pas si mon ami, il semble que vous ne comprenez pas la mise en œuvre de la statique dans des classes génériques abstraites. Pouvez-vous s'il vous plaît créer une application de console rapide, copier mon code ci-dessus, puis l'exécuter. Ensuite, veuillez rétracter votre commentaire, votre vote en direct, et peut-être envisager de voter, car c'est la réponse la plus élégante à la question posée.
Vous êtes correct et je m'excuse. J'étais surplombant les génériques !! J'ai fait une petite édition mineure de votre réponse simplement pour que je puisse voter dessus.
Cependant, l'OP ne peut pas l'utiliser car "je n'ai aucun contrôle sur les sous-classes"
Oui, cette petite "fonctionnalité" de statique des génériques abstraites m'a coûté sur une journée de débogage d'une application. J'ai été vraiment surpris que les statistiques soient uniques dans les cours d'enfant. Ce n'était certainement pas ce que je prévois même sauvagement
Parfait. Cela met fin aux guerres de religion sur la statique: d.
Solution simple: utilisez simplement le mot "nouveau". et le résultat: p> ou vous pouvez utiliser la propriété: < / p> ou fonction (mais n'oubliez pas d'ajouter "nouveau" à la variable et à la fonction): p> ou vous pouvez utiliser Variables privées (vous n'avez pas besoin d'utiliser "Nouveau") avec des fonctions pour obtenir et définir: p>
Vous pouvez probablement le faire en piratage d'un dictionnaire dictionnaire code> et appelant
gettype () code>, mais ce serait horrible ...
Pour que les membres statiques virtuels / abstraits soient gentils. Voir << A HREF = "http://www.dotnetrocks.com/text/0448/index9.html" rel = "Nofollow Noreferrer"> dotnetrocks.com/text/0448/index9.html > (recherche Pour "Membre statique virtuel")
Pourquoi ne pas simplement le rendre statique?
BlackTigerx, la valeur doit être la même pour chaque instance de classb - mais différente de la valeur de Classc
L'utilisation du type dans le dictionnaire de classe de base fonctionnera. Merci pour l'idée, je n'avais pas considéré cela comme un moyen de le faire fonctionner.