12
votes

Faire une superclasse a une variable statique différente pour chaque sous-classe en C #

sans aucun code dans les sous-classes , j'aimerais qu'une classe abstraite ait une copie différente d'une variable statique pour chaque sous-classe. En C # xxx

et (par exemple): xxx

Ma solution actuelle est la suivante: xxx

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?

Ceci est similaire à puis-je avoir des copies différentes d'une variable statique pour chaque type de classe de héritage , mais je n'ai aucun contrôle sur les sous-classes


5 commentaires

Vous pouvez probablement le faire en piratage d'un dictionnaire dictionnaire et appelant gettype () , 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.


6 Réponses :


6
votes

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?

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.

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.


1 commentaires

Pour ceux qui trébuchent sur cela, assurez-vous de voir la réponse de @ Jimbob ci-dessous.



0
votes

Il y a une solution alternative qui pourrait être meilleure ou non meilleure que la tienne, en fonction du cas d'utilisation: xxx

Cette approche est utilisée dans Equalitalcander .default . Bien sûr, ce n'est pas utilisé pour ce problème. Vous devriez vraiment envisager de faire getvalue abstrait et le remplacer dans chaque classe dérivée.


1 commentaires

@ 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.



2
votes

C'est un peu différent de ce que vous demandez, mais peut-être accomplir la même chose. XXX


1 commentaires

C'est l'évidence + meilleur moyen - malheureusement je ne peux pas modifier les classes B & C



0
votes

Et cela? XXX

Cela fonctionne pour moi. Serait encore plus agréable avec une interface.


2 commentaires

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.



10
votes

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 xxx

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. xxx

MAINTATIC MYPROPERTY est unique pour les enfants et l'enfant xxx


6 commentaires

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.



-1
votes

Solution simple: utilisez simplement le mot "nouveau". xxx

et le résultat: xxx

ou vous pouvez utiliser la propriété: < / p> xxx

ou fonction (mais n'oubliez pas d'ajouter "nouveau" à la variable et à la fonction): xxx

ou vous pouvez utiliser Variables privées (vous n'avez pas besoin d'utiliser "Nouveau") avec des fonctions pour obtenir et définir: xxx


0 commentaires