40 votes

Remplacer une méthode statique

J'étends une nouvelle classe en héritant de RolesService. Dans RolesService, j'ai un méthog statique que je voudrais remplacer dans ma classe nouvellement dérivée. Lorsque j'appelle à partir de mon objet dérivé, il n'utilise pas la méthode statique remplacée, il appelle en fait la méthode de classe de base. Des idées?

 public class RolesService : IRolesService
    {
    public static bool IsUserInRole(string username, string rolename)
    {
        return Roles.IsUserInRole(username, rolename);
    }
}

public class MockRoleService : RolesService
{
    public new static bool IsUserInRole(string username, string rolename)
    {
        return true;
    }
}
 

39voto

Thomas Levesque Points 141081

Vous ne pouvez pas remplacer une méthode statique. Une méthode statique ne peut pas être virtuelle, car elle n'est pas liée à une instance de la classe.

La méthode "surchargée" dans la classe dérivée est en fait une nouvelle méthode, sans rapport avec celle définie dans la classe de base (d'où le mot-clé new ).

19voto

MHinton Points 635

Procéder comme suit vous permettra de contourner l'appel statique. Lorsque vous souhaitez utiliser le code, prenez un IRolesService via l'injection de dépendance, puis lorsque vous avez besoin de MockRolesService, vous pouvez le transmettre.

 public interface IRolesService
{
    bool IsUserInRole(string username, string rolename);
}

public class RolesService : IRolesService
{
    public bool IsUserInRole(string username, string rolename)
    {
        return Roles.IsUserInRole(username, rolename);
    }
}

public class MockRoleService : IRolesService
{
    public bool IsUserInRole(string username, string rolename)
    {
        return true;
    }
}
 

18voto

Aaronaught Points 73049

Vous ne pouvez pas remplacer une méthode statique.

Si vous pensez à ce sujet, il n'a pas vraiment de sens; afin d'avoir virtuel d'expédition vous avez besoin d'une véritable instance d'un objet à vérifier.

Une méthode statique est également impossible de mettre en œuvre une interface; si cette classe est la mise en œuvre d'un IRolesService interface, puis je prétends que la méthode ne doit pas être statique à tous. C'est mieux de design afin d'avoir une méthode d'instance, de sorte que vous pouvez échanger votre MockRoleService avec un réel service lorsque vous êtes prêt.

11voto

keyboardP Points 44625

Vous ne pouvez pas remplacer une méthode statique. Vous pourriez trouver ceci une lecture intéressante.

3voto

Jeff Wight Points 383

Afin d'appeler une méthode statique, vous aurez besoin d'une référence directe du type:

RolesService.IsUserInRole(...);

Dans ce cas, si vous voulez être en mesure et d'appeler la "dérivée" de la classe de la méthode statique, l'abandon de la "nouvelle" mot-clé vous permettra de:

MockRoleService.IsUserInRole(...);

et obtenir les attendus de l'appel de fonction.

Ma conjecture est que ce n'est pas ce que vous cherchez. Vous avez probablement certains appellent quelque part dans votre code comme l'ancien, et vous espérez qu'en utilisant un Moqueur outil pour créer une MockRoleService, vous seriez l'injection de ce nouveau "type" à la place de l'ancien. Malheureusement, ce n'est pas la façon dont il fonctionne avec la statique.

Un moqueur outil va créer une instance de la moqué de type et permettra d'injecter que la place d'un appel à construire le type réel. Un appel à une méthode statique ignore tout cela.

Comme Aaronaught mentionné, vous devriez probablement faire de cette méthode normale de la méthode d'instance. Cela permettra à votre fantaisie service pour être correctement injecté à la place de votre RolesService, vous permettent de déplacer la déclaration de méthode dans votre IRolesService interface, et de la remplacer dans votre MockRoleService mise en œuvre. Ensuite, dans le code où que vous "obtenez" un RolesService, il vous suffit d'appeler le membre de l'instance au lieu de la statique.

IRolesService svc = MyServiceInjector.GetService<IRolesService>();
svc.IsUserInRole(...);

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