Je suis nouveau sur les interfaces en C #. Alors quelqu'un peut-il s'il vous plaît expliquer ce qui se passe réellement lorsque nous créons un objet d'interface?
Je sais pourquoi nous avons des interfaces dans d'autres langages mais je ne peux pas vraiment comprendre la logique de Pourquoi C # permet-il la création d'un objet (instance) d'interface? Si les interfaces n'ont pas de définition de fonction ou de variable, comment créer un objet?
J'ai cherché sur les forums mais je n'ai pas compris. voici un tutoriel que j'ai trouvé sur les interfaces http://www.c-sharpcorner.com/uploadfile/6897bc/interfaces-in-C-Sharp/ si vous visitez le lien, vous pouvez voir que l'auteur commence à créer des objets d'une classe et qu'un objet d'interface. Quand il écrit
Interface_object = class_object;
l'objet interface extrait les caractéristiques de l'objet classe ...
Comment et pourquoi cela se produit s’il n’ya pas d’implémentation ni de variable dans l’interface?
En réalité, vous ne pouvez pas créer une instance d'interface.
Vous créez une instance d'une classe, implémentant l'interface. En réalité, il peut y avoir des dizaines de classes implémentant une interface. Ainsi, lorsque vous utilisez une variable de type interface, la seule chose qui vous garantit que l'objet, qui est en fait référencé par la variable, implémente l'interface et que vous pouvez utiliser n'importe laquelle des méthodes, propriétés, etc. de l'interface.
interface IFoo
{
void DoFoo();
}
class Foo1: IFoo
{
public DoFoo()
{
//one implementation
}
}
class Foo2: IFoo
{
public DoFoo()
{
//the other implementation
}
}
IFoo tmp = new Foo1();
tmp = new Foo2();
Vous pouvez voir une explication détaillée dans SO: Utilisation de variables d'interface
quelqu'un peut-il s'il vous plaît expliquer ce qui se passe réellement lorsque nous créons un objet d'interface?
Une analogie que j’aime utiliser est qu’une interface est semblable à un masque: lorsque vous créez une instance d’une classe qui implémente une interface (par exemple, IFoo ), vous la considérez comme l’interface. un masque qu'un acteur porterait - la classe semble être et agit comme une interface (masque) même s'il y a tout un tas de choses sous le masque (interface).
mais ne peut pas vraiment saisir la logique de Pourquoi C # permet la création d'un objet (instance) d'interface?
L'autre chose à mentionner est qu'une interface est un contrat - quelles que soient les méthodes/propriétés/etc. définies sur l'interface, son implémentation sur la classe est garantie. Des classes complètement différentes les unes des autres peuvent implémenter la même interface. Lorsque vous avez une instance de chaque classe et que vous la traitez (transmettez-la) comme interface, les mêmes méthodes peuvent être appelées sur chaque classe, bien que l'implémentation (réelle). code) dans chaque classe peut être très différent.
Exemple:
Les classes Car
et Human
implémentent toutes deux l'interface IMove
, et IMove
définit la méthode void Move();
. Ce sont deux classes totalement non apparentées sans ancêtres communs, mais si vous avez une instance de Car et Human, elles ont toutes les deux la garantie d'avoir la méthode void Move()
, bien que le code de cette méthode diffère entre elles car elles se déplacent de manière totalement différente. façons. Si vous transtypez ensuite ces différents objets sur la même interface (var x = (IMove) someCar
ou var x = someHuman as IMove
), vous pouvez traiter la référence de l'objet de manière identique.
Les interfaces et les classes abstraites présentent certaines similitudes - elles spécifient toutes deux des choses de manière contractuelle (l’extendeur ou l’implémenteur doit implémenter des choses spécifiques) et ne peuvent pas être créées directement (la différence est que les classes abstraites peuvent fournir une certaine implémentation, alors que les interfaces ne peuvent pas, et les interfaces ne peuvent être implémentées, jamais héritées).
Si vous vous demandez ce qui se passe sous le capot au niveau de MSIL, il existe d'autres personnes beaucoup plus qualifiées ici qui peuvent élaborer sur ce point.
L'interface est que, juste une interface. Vous ne pouvez pas instancier une interface. Vous pouvez l'utiliser comme une variable qui pointe vers une classe qui implémente cette interface. Interface est un ensemble public de méthodes/propriétés garantissant que toutes ses méthodes sont implémentées. Les classes abstraites sont similaires aux interfaces mais ne fournissent pas une telle garantie.
En POO, il s’agit d’une sorte de polymorphisme et il existe d’autres types de polymorphismes.
Vous ne pouvez pas créer un objet d'une interface, mais vous pouvez créer un objet d'une classe et laisser la classe utiliser l'interface.
Vous ne pouvez pas instancier des interfaces. Mais vous pouvez créer une nouvelle référence de l'interface, si la classe l'implémente.
Cela crée simplement une nouvelle référence de l'objet MyNokiaOldPhone
INokiaOld iface = phone;
qui implémente l'interface INokiaOld
.
Vous n'avez pas create une instance d'interface, mais vous lui affectez une référence d'instance d'objet dérivé, de sorte qu'elle soit intégrée à ce type d'interface. C'est un polymorphysme .
Autant que je sache, vous ne pouvez pas créer une instance d'interface et même si nous le faisons, cela ne serait d'aucune utilité, car aucun des membres de cette classe n'est implémenté. Même est le cas avec la classe abstraite. C’est parce qu’ils sont incomplets (c’est-à-dire qu’ils agissent en tant que modèles) et que la création d’un objet n’a pas de sens pour les classes incomplètes.