C#: Comment faire pour appeler une méthode statique d'une classe de base à partir d'une méthode statique d'une classe dérivée?
En C#, j'ai de la classe de base des Produits et dérivés de la classe Widget.
Produit contient une méthode statique MyMethod().
Je tiens à appeler la méthode statique Produit.MyMethod() à partir de la méthode statique Widget.MyMethod().
Je ne peux pas utiliser le mot clé base, parce que cela ne fonctionne qu'avec les méthodes d'instance.
Je peux appeler Produit.MyMethod() explicitement, mais si j'ai à changer plus tard Widget à dériver d'une autre classe, je dois réviser la méthode.
Est-il une syntaxe en C# similaire à la base qui me permet d'appeler une méthode statique d'une classe de base à partir d'une méthode statique d'une classe dérivée?
Une raison pour laquelle cette méthode est statique?
La meilleure solution à ce problème est de renommer
La meilleure solution à ce problème est de renommer
Widget.MyMethod
. Premier pense que si Widget.MyMethod
et Product.MyMethod
font la même chose que leur nom soit le même.. Si elles sont équivalentes (même chose pour l'utilisateur), vous êtes seule option est de les rendre non-méthodes statiques.. Alors que je pense qu'il serait utile, C# n'ont pas le concept d'héritage sur les membres statiques. Penser à un petit-enfant de la classe de FancyWidget
, ce qui devrait FancyWidget.MyMethod
appel? Si vous pensez que Widget.MyMethod
alors C# ne marche pas avoir une chose pour que (ni n'importe quel langage de programmation orientée objet, je pense).OriginalL'auteur MindModel | 2009-03-02
Vous devez vous connecter pour publier un commentaire.
static
méthodes sont en fait une méthode de secours à partir des concepts orientés objet. En conséquence, ils ne sont pas très flexibles dans des hiérarchies d'héritage et il n'est pas possible de faire une telle chose directement.La chose la plus proche que je peux penser est un
using
directive.Une méthode qui ne reposent pas sur un instance ne se jouent pas de la plupart des règles définies pour des objets virtuels (méthode d'expédition, ...).
mindmodel, alors qu'il ya certains scénarios, si vous commencez à avoir besoin de l'héritage ou de la [insérer toute autre restriction ou non des méthodes statiques] c'est un symptôme que quelque chose d'autre peut-être ... peut-être la classe ont trop de responsabilités
mes sentiments exactement. Presque toujours lorsque vous essayez de faire quelque chose de la langue n'a pas de soutien, alors que vous utilisez la mauvaise langue, ou d'essayer de placer une cheville carrée dans un trou rond. Ruby obtiendrait @mindmodel plus proche de ce qu'il veut, étant donné que les classes sont des objets.
Je suis en désaccord que les méthodes statiques ne sont pas orientées objet. Ils peuvent être utilisés de cette façon, souvent, mais, comme le dit l'adage "vous pouvez écrire Fortran dans n'importe quelle langue." Au pire, les concepts sont orthogonaux. Voir ma réponse pour un cas classique où les méthodes statiques sont utilisés directement à l'appui d'un paradigme orienté objet, le modèle de Fabrique.
OriginalL'auteur Mehrdad Afshari
Il peut être fait, mais je ne le recommande pas.
Exactement. Dix Caractères
au lieu de l'aide de la chaîne que vous pourriez utiliser MethodBase.GetCurrentMethod().Nom
OriginalL'auteur marcumka
L'appel d'une méthode statique à l'aide de la réflexion est exactement le même que l'appel d'une méthode d'instance, sauf que vous passez la valeur null pour l'instance. Vous avez besoin FlattenHierarchy parce qu'il est défini dans un ancêtre.
Plus de la lecture et de la pensée laisse me poser les mêmes questions que les autres qui ont répondu: pourquoi utiliser des méthodes statiques comme cela? Essayez-vous de faire de la programmation fonctionnelle, et si oui, pourquoi ne pas utiliser des expressions lambda à la place? Si vous voulez polymophic comportements avec l'état partagé, les méthodes d'instance serait mieux.
OriginalL'auteur Peter Wone
Il peut être fait:
Peut être utile pour les tests unitaires protégé méthodes statiques (par exemple).
OriginalL'auteur mlipman
D'abord et avant tout, si vous êtes inquiet au sujet de re-parenting une classe, alors vous êtes probablement à faire de l'héritage de mal. L'héritage doit être utilisé pour établir "est-un" relations", pas simplement de favoriser la réutilisation du code. Si vous avez besoin d'un code de ré-utiliser seul, pensez à utiliser la délégation, plutôt que de l'héritage. Je suppose que vous pourriez introduire un type intermédiaire entre un sous-type et son parent, mais je ne laisserais pas cette possibilité lecteur de mon design.
Seconde, si vous avez besoin d'utiliser la fonctionnalité de la classe de base, mais de l'étendre ET le cas d'utilisation des appels pour une méthode statique, vous souhaitez peut-être envisager d'utiliser une partie externe de la classe afin de conserver la fonctionnalité. Le cas classique à cela dans mon esprit, c'est le modèle de Fabrique. Une façon de mettre en œuvre le modèle de Fabrique est par le biais de Méthodes de Fabrique, une méthode statique d'une classe qui construit une instance de cette classe. Habituellement, le constructeur est protégé de sorte que la méthode est la seule façon de construire la classe de l'extérieur.
Une voie d'approche pour ré-usage avec de l'Usine de Méthodes dans une hiérarchie d'héritage serait de mettre le code dans une méthode protégée et appeler cette méthode à partir de l'Usine de Méthode plutôt que d'appeler directement la classe de base de l'Usine de Méthode à partir d'un sous-types de Méthode de Fabrique. Une meilleure mise en œuvre pourrait utiliser la même technique, mais de déplacer l'Usine des Méthodes à une classe Factory et utiliser le constructeur de la logique (interne maintenant, pas dans le privé), peut-être en collaboration avec une méthode d'initialisation(s), pour créer l'objet. Si le comportement que vous hériterez est externe à partir de la classe (décryptage/validation/etc), vous pouvez utiliser des méthodes communes (ou composition) au sein de l'Usine pour permettre la ré-utilisation entre les méthodes de Fabrique.
Sans connaître le but de votre utilisation de méthodes statiques, il est difficile de vous donner un sens exact, mais j'espère que cela aidera.
OriginalL'auteur tvanfosson
Méthodes statiques ne sont pas polymorphes, donc ce que vous voulez faire, c'est impossible.
En essayant de trouver un moyen de traiter les méthodes statiques comme polymorphe est possible mais dangereux, parce que le langage lui-même ne le supporte pas.
Quelques suggestions:
OriginalL'auteur Michael Meadows
Avoir en compte qu'une méthode Statique shoudn pas de relais dans les données de l'instance... vous devriez avoir une statique "MyMethod" qui se comporte de façon différente en fonction d'un paramètre ou quelque chose comme ça.
Rappelez-vous que la statique de la méthode définie dans une classe est simplement un moyen pour commander votre code... mais c'est la même chose si la méthode est placé ailleurs... parce qu'il n'a pas de relais sur l'objet où il est placé.
EDIT: je pense que votre meilleur choix est d'utiliser le Produit.MyMethod explicitement... Si vous pensez que ça... ça doit pas être probable que votre Widget modifier sa base de clase... et aussi, dans ce cas, c'est un changement mineur dans le code.
Vrai. Vous savez la différence entre les variables statiques (un par classe) et les variables d'instance (un par exemple). Pourquoi cette distinction est-elle pas utile? Pourquoi c'est mal OO design?
Eh bien, je l'ai dit que vous "ne Devrait pas" pas de relais dans la variable d'instance de données... bien sûr, vous "POUVEZ". 🙂
OriginalL'auteur Romias
Méthodes statiques sont "Classe", au Niveau des méthodes. Ils sont destinés à être des méthodes qui s'appliquent à toutes les instances d'une classe spécifique. Ainsi, l'héritage de cette méthode n'a de sens qu'il modifierait le sens de s'appliquer aux instances de la classe. Par exemple, si vous étiez en boucle à travers une collection de Produits (dont certains Widget, d'autres pas) et appelé MyMethod sur chaque Produit, alors la méthode qui a été appelé seraient déterminées par l'instance de la classe. Cela viole le but de méthodes statiques.
Vous pouvez probablement faire quelque chose comme vous voulez plus proprement par tout simplement pas à l'aide de méthodes statiques, parce que dans votre exemple, il ne semble pas que MyMethod s'applique à toutes les instances de Produit. Cependant, vous pouvez obtenir le même effet que vous décrivez à l'aide d'une interface de classe comme " IMyMethod’. Cette approche n'est pas encore à l'aide d'une méthode statique. Je suppose que je ne suis pas voyant un besoin pour une méthode statique. Pourquoi voulez-vous utiliser une méthode statique pour commencer?
OriginalL'auteur Dunk
C'est très simple. Beaucoup plus simple que d'utiliser de l'aliasing, réflexions, etc. C'est peut-être plus facilement dans de nouveaux ajouts de .NET, IDK, mais cela fonctionne parfaitement bien. Tout comme avec les méthodes d'instance, l'accès à la base de méthodes ne nécessitent pas de
base
être utilisé, il est facultatif, généralement nécessaire lors de l'héritage et de la classe de base ont une méthode du même nom. Même sans lebase
mot-clé, vous pouvez accéder aux méthodes statiques d'une classe de base comme s'ils étaient dans la classe que vous appelez. J'ai uniquement testé lors d'un appel de la base de statique méthode d'une classe dérivée de statique méthode. Peut ne pas fonctionner si vous appelez à partir d'un instance méthode à une méthode statique.Base.StaticMethod
explicitement, ces deux sont le noeud du problème.Ouai ressemble pas où ont-ils dire "de la méthode statique du même nom". Cela aurait été un meilleur titre. Je vois qu'ils ont mentionnés
from static method Widget.MyMethod().
qui se trouve être le même nom que la méthode de base. C'est là que l'exemple de code rend les choses plus claires. Je voudrais juste leur exemple à la solution. Je vais laisser ma réponse comme c'est depuis cela vient de google avec un applicable au titre de la question pour l'appel d'une méthode statique de la classe de base.OriginalL'auteur AaronLS