c# - programacion - ¿Por qué no puedo llamar a los métodos dentro de una clase que explícitamente implementa una interfaz?
que es un metodo en programacion (3)
Aquí está la historia. He creado una interfaz, IVehicle
. Implementé explícitamente la interfaz en mi clase, Vehicle.cs
.
Aquí está mi interfaz:
Interface IVehicle
{
int getWheel();
}
aquí está mi clase:
class Vehicle: IVehicle
{
public int IVehicle.getWheel()
{
return wheel;
}
public void printWheel()
{
Console.WriteLine(getWheel());
}
}
Tenga en cuenta que getWheel()
está implementado explícitamente. Ahora, cuando trato de llamar a ese método dentro de mi clase de Vehículo, recibo un error que indica que getWheel()
no existe en el contexto actual. ¿Puede alguien ayudarme a entender lo que estoy haciendo mal?
Cuando implementa explícitamente la interfaz, primero debe enviar el objeto a la interfaz, luego puede llamar al método. En otras palabras, el método solo está disponible cuando el método se invoca en el objeto como el tipo de interfaz, no como el tipo concreto.
class Vehicle: IVehicle {
public int IVehicle.getWheel()
{
return wheel;
}
public void printWheel()
{
Console.WriteLine( ((IVehicle)this).getWheel() );
}
}
Consulte esta reference en MSDN para obtener más información. Aquí está el fragmento relevante:
No es posible acceder a una implementación de miembro de interfaz explícita a través de su nombre completo en una invocación de método, acceso de propiedad o acceso de indexador. Solo se puede acceder a una implementación de miembro de interfaz explícita a través de una instancia de interfaz, y en ese caso se hace referencia simplemente por su nombre de miembro.
Por lo que vale, probablemente este no sea un buen uso de la implementación explícita de la interfaz. Normalmente, desea utilizar una implementación explícita cuando tiene una clase que tiene una interfaz completa para las operaciones típicas, pero también implementa una interfaz que puede reemplazar algunas de esas operaciones. El ejemplo canónico es una clase File
que implementa IDisposable
. Tendría un método Close()
pero se le exigiría que implementara Dispose()
. Al tratar como un File
, usaría Open/Close
. Sin embargo, cuando se abre en una declaración using, la tratará como un IDisposable
y se llamará Dispose
. En este caso, Dispose
simplemente llama a Close
. No necesariamente querrá exponer a Dispose
como parte de la implementación de File
ya que el mismo comportamiento está disponible desde Close
.
Para evitar una gran cantidad de lanzamientos aburridos en su clase, puede crear un puntero como tipo de interfaz
public class Foo : IBar
{
readonly IBar bar;
public Foo()
{
bar = this;
}
}
Y luego llama a los miembros usando la bar.
Según MSDN :
Es posible implementar un miembro de la interfaz explícitamente, creando un miembro de clase que solo se llama a través de la interfaz y es específico para esa interfaz.
Y en las reference :
No es posible acceder a una implementación de miembro de interfaz explícita a través de su nombre completo en una invocación de método, acceso de propiedad o acceso de indexador. Solo se puede acceder a una implementación de miembro de interfaz explícita a través de una instancia de interfaz, y en ese caso se hace referencia simplemente por su nombre de miembro.
Para acceder a este miembro, primero puede enviar la clase a la interfaz y luego acceder a ella.