63 votes

Méthodes statiques et d'instance portant le même nom?

J'ai une classe à la fois statiques et non statiques de l'interface en C#. Est-il possible d'avoir une statique et une non-méthode statique dans une classe avec le même nom et la signature?

J'obtiens une erreur du compilateur lorsque j'essaie de le faire, mais pour une raison que je pensais qu'il y avait une façon de le faire. Je me trompe ou il n'y a pas moyen d'avoir à la fois statiques et non statiques et méthodes dans la même classe?

Si ce n'est pas possible, est-il une bonne façon de mettre en œuvre quelque chose comme ce qui peut être appliqué de façon générique pour n'importe quelle situation?

MODIFIER
À partir des réponses que j'ai reçu, il est clair qu'il n'existe aucun moyen pour ce faire. Je vais avec un autre système de nommage pour contourner ce problème.

64voto

ckramer Points 7315

La raison de cette limitation est que les méthodes statiques peuvent également être appelées à partir de contextes non statiques sans avoir à ajouter le nom de classe (donc MyStaticMethod () au lieu de MyClass.MyStaticMethod ()). Le compilateur ne peut pas dire ce que vous recherchez si vous avez les deux.

Vous pouvez avoir des méthodes statiques et non statiques avec le même nom, mais des paramètres différents qui respectent les mêmes règles que la surcharge de méthodes. Elles ne peuvent tout simplement pas avoir exactement la même signature.

58voto

andasa Points 91

En fait, il existe un moyen d'accomplir cela en implémentant explicitement une interface. Ce n'est pas une solution parfaite, mais cela peut fonctionner dans certains cas.

 interface IFoo
{
    void Bar();
}

class Foo : IFoo
{
    static void Bar()
    {
    }

    public void IFoo.Bar()
    {
        Bar();
    }
}
 

Je rencontre parfois cette situation lorsque je crée des classes wrapper pour les appels P / Invoke.

11voto

Matt Hamilton Points 98268

Vous pouvez appeler des méthodes statiques à partir de méthodes d'instance sans avoir à spécifier le nom du type:

 class Foo
{
    static void Bar()
    {
    }

    void Fizz()
    {
        Bar();
    }
}
 

... il est donc logique que vous ne soyez pas autorisé à utiliser une méthode statique et une méthode d'instance avec la même signature.

Qu'est-ce que vous essayez d'accomplir? Il est difficile de suggérer une solution de contournement sans connaître les détails. Je voudrais juste renommer l'une des méthodes.

0voto

Franci Penov Points 45358

Vous pouvez avoir statique et de la méthode d'instance avec le même nom, aussi longtemps que leur déclaration en diffère par le nombre ou le type des paramètres. C'est la même règle sur la façon dont vous pouvez disposez de deux méthodes d'instance avec le même nom dans une classe.

Si, techniquement, dans le cas de la statique vs. méthode d'instance, ils diffèrent par la présence de l'implicite de ce paramètre dans la méthode d'instance, que la différence n'est pas assez pour le compilateur de déterminer lequel des deux vous voulez l'appeler.

Mise à jour: j'ai fait une erreur. Les valeurs de retour ne sont pas assez pour avoir des signatures différentes.

0voto

Adrian Points 1

OK. La racine de ce problème est que le C# ne doit pas vous permettent d'appeler une méthode statique à partir d'une méthode d'instance, sans préciser le nom du type.

D'autres langages à objets (comme Smalltalk) ne permettent pas de cela et aussi le son vient de la confusion pour les personnes qui comprennent des objets. La séparation entre l'instance côté et la classe (ou statique) côté est très important et avoir une langue qui favorise la confusion dans les détails, c'est........pas une bonne idée....mais typique du genre de chose que nous attendons de MME

Adrian

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X