web-dev-qa-db-fra.com

Pourquoi est-ce que je reçois une erreur lors de l'instanciation d'une interface?

J'ai une classe et une interface, et quand j'essaye d'instancier l'interface, j'obtiens une erreur:

Impossible de créer une instance de la classe abstraite ou de l'interface

Mon code est ci-dessous:

namespace MyNamespace
{
    public interface IUser
    {
        int Property1 { get; set; }
        string Property2 { get; set; }
        string Property3 { get; set; }
        void GetUser();
    }

    public class User : IUser
    {
        public int Property1 { get; set; }
        public string Property2 { get; set; }
        public string Property3 { get; set; }

        public void GetUser()
        {
           //some logic here...... 
        }

    }
}

Lorsque j'essaie d'instancier IUser user = new IUser();, une erreur se produit:

Impossible de créer une instance de la classe abstraite ou de l'interface

Qu'est-ce que je fais mal ici?

41
Alex

Le message d'erreur semble aller de soi. Vous ne pouvez pas instancier une instance d'interface et vous avez déclaré IUser en tant qu'interface. (La même règle s’applique aux classes abstraites.) L’intérêt d’une interface est de ne pas faire : aucune implémentation n’est fournie pour sa méthodes.

Cependant, vous pouvez instancier une instance d'une classe qui implémente cette interface. (fournit une implémentation pour ses méthodes), qui dans votre cas est la classe User.

Ainsi, votre code doit ressembler à ceci:

IUser user = new User();

Ceci instancie une instance de la classe User (qui fournit l’implémentation) et l’assigne à une variable d’objet pour le type d’interface (IUser, qui fournit l’interface, la manière dont le programmeur peut interagir avec l'objet).

Bien sûr, vous pouvez aussi écrire:

User user = new User();

qui crée une instance de la classe User et l’assigne à une variable d’objet du même type, mais cette sorte de réfute l’objet de la définition d’une interface distincte en premier lieu.

46
Cody Gray

Imaginez si quelqu'un se rendait dans un magasin et demandait un appareil avec un interrupteur d'alimentation. Vous n'avez pas dit si vous vouliez un photocopieur, une télévision, un aspirateur, une lampe de bureau, un gaufrier ou autre. Vous avez demandé un appareil avec un interrupteur d'alimentation. Vous attendriez-vous à ce que le greffier vous propose quelque chose qui pourrait uniquement être décrit comme "un appareil avec un interrupteur d'alimentation"?

Une interface typique serait analogue à la description "un appareil avec un interrupteur d'alimentation". Le fait de savoir qu’un équipement est "un appareil doté d’un interrupteur d'alimentation" permettrait d'effectuer certaines opérations avec ce dernier (c'est-à-dire de l'allumer et de l'éteindre), et on pourrait probablement vouloir une liste de, par exemple. "appareils avec interrupteurs d'alimentation qui devront être éteints à la fin de la journée", sans que les appareils n'aient à partager une caractéristique autre que celle d'un interrupteur d'alimentation, mais de telles situations ne s'appliquent généralement que lorsque certaines opérations courantes sont appliquées aux appareils créés pour un but plus spécifique. Lorsque vous créez quelque chose à partir de zéro, il est plus probable que vous utilisiez un "copieur", une "télévision", un "aspirateur" ou un autre type particulier de périphérique, plutôt qu'un "périphérique avec un commutateur d'alimentation" aléatoire.

Dans certaines circonstances, on peut souhaiter un objet défini de manière vague et ne pas se soucier de ce que c'est exactement. "Donnez-moi votre appareil le moins cher qui peut faire bouillir de l'eau". Ce serait bien si l'on pouvait spécifier que lorsqu'un utilisateur demande un objet arbitraire ayant la capacité "d'ébullition de l'eau", il devrait lui être offert une bouilloire électrique 359 Acme, et bien sûr, lorsque vous utilisez des cours, il est possible de le faire. Notez, cependant, que quelqu'un qui demande un "dispositif pour faire bouillir de l'eau" ne recevra pas un "dispositif pour faire bouillir de l'eau", mais un "Acme 359 Electric Teakettle".

36
supercat

IUser est l'interface, vous ne pouvez pas l'instancier.

Vous devez instancier la classe concrète qui implémente l'interface.

IUser user = new User();

ou

User user = new User();
15
ChrisBint

Vous ne pouvez pas instancier des interfaces ou des classes abstraites.

C'est parce que cela n'aurait aucune logique.

Interfaces fournit un contrat des méthodes devant figurer dans une classe, sans implémentation. (Donc, il n'y a pas de logique réelle dans l'interface).

Les classes abstraites fournissent la logique de base d'une classe, mais ne sont pas entièrement fonctionnelles (tout n'est pas implémenté). Encore une fois, vous ne pourrez rien faire avec.

5
Yochai Timmer

Vous ne pouvez pas instancier une classe abstraite ou une interface. Vous devez en hériter, s'il s'agit d'une classe abstraite, ou l'implémenter s'il s'agit d'une interface. par exemple.

...
private class User : IUser
{
  ...
}

User u = new User();
2
George Johnston

C'est ce qu'il dit, vous ne pouvez pas instancier une classe abstraite. Vous devez d'abord l'implémenter, puis instancier cette classe.

IUser user = new User();
0
Erkan Haspulat