Pourquoi ne puis-je pas l'appel de méthodes à l'intérieur d'une classe qui, explicitement implémente une interface?
Voici l'histoire. J'ai créé une interface, IVehicle
. J'ai explicitement mis en œuvre l'interface dans ma classe, Vehicle.cs
.
Voici mon interface:
Interface IVehicle
{
int getWheel();
}
voici ma classe:
class Vehicle: IVehicle
{
public int IVehicle.getWheel()
{
return wheel;
}
public void printWheel()
{
Console.WriteLine(getWheel());
}
}
Avis que getWheel()
est explicitement mis en œuvre. Maintenant, quand j'essaie de appel cette méthode dans ma classe de Véhicule, j'ai un message d'erreur indiquant que getWheel()
n'existe pas dans le contexte actuel. Quelqu'un peut-il m'aider à comprendre ce que je fais de mal?
- En tant QUE java personne, je me demande pourquoi ce alambiqué chose existe ? Pourquoi quelqu'un voudrait-le au-dessus d'exister, ce qui avantage est le gain ?
- La spécification d'un modificateur de visibilité sur un explicitement mise en œuvre de membre est une erreur de syntaxe. Le membre est toujours accessible une fois que votre objet a été coulé à votre type d'interface.
- Si vous êtes à la mise en œuvre de multiples interfaces avec d'une commune membre, ce qui vous permet de fournir des définitions différentes de par interface. Aussi, il ajoute à nettoyer intellisense, parce que l'explicite les membres ne sont pas visibles ou utilisables, sauf si vous lancez l'interface appropriée.
Vous devez vous connecter pour publier un commentaire.
Lorsque vous décidez d'implémenter l'interface, vous devez d'abord convertir l'objet à l'interface, vous pouvez appeler la méthode. En d'autres termes, la méthode n'est disponible que lorsque la méthode est appelée sur l'objet que le type d'interface, non pas comme le type de béton.
Voir ce référence à MSDN pour plus d'informations. Voici pertinentes de l'extrait:
Pour ce que ça vaut -- ce n'est probablement pas une très bonne utilisation de l'interface explicite de mise en œuvre. En règle générale, vous souhaitez utiliser explicite de mise en œuvre lorsque vous avez une classe qui a une interface complète pour les opérations courantes, mais aussi implémente une interface qui peut remplacer certains de ces opérations. L'exemple canonique est un
File
classe qui implémenteIDisposable
. Il aurait unClose()
méthode, mais être nécessaires pour mettre en œuvreDispose()
. Lorsque le traiter comme unFile
vous utilisezOpen/Close
. Lors de son ouverture dans une instruction d'utilisation, cependant, il va la traiter comme uneIDisposable
et appelDispose
. Dans ce casDispose
appelle simplementClose
. Vous n'auriez pas forcément envie d'exposerDispose
dans le cadre de laFile
mise en œuvre depuis le même comportement est disponible à partir deClose
..Designer
les fichiers d'une application winforms. Chaque contrôle est initialisé entre une paire de.BeginInit()
et.EndInit()
méthodes, mais ces appels sont tous fabriqués après casting le contrôle deISupportInitialize
.Selon MSDN:
Et dans le Langage C# spécifications:
Pour accéder à ce membre, vous pouvez jette le premier de la classe à l'interface, et y accéder.
Pour éviter un lot de ennuyeux jette sur votre classe, vous pouvez créer un pointeur comme le type d'interface
Et ensuite appeler les membres à l'aide de
bar.