c# - que - public en programacion
Modificadores de acceso en los miembros de la interfaz en C# (2)
Recibo un error de compilación de la siguiente propiedad.
El error es:
"El modificador ''public'' no es válido para este elemento"
public System.Collections.Specialized.StringDictionary IWorkItemControl.Properties
{
get { return properties; }
set { properties = value; }
}
pero si quito el IWorkItemControl
se compila bien.
¿Por qué recibo este error y cuál es la diferencia de tener / no tener el nombre de la interfaz en la firma?
Todos los elementos de una interfaz deben ser públicos. Después de todo, una interfaz es la vista pública de un objeto.
Dado que las Propiedades son un elemento de una interfaz IWorkItemControl , ya es público y no puede especificar su nivel de acceso, incluso para especificar de forma redundante que es público.
La implementación de la interfaz explícita no le permite especificar ningún modificador de acceso. Cuando implementas un miembro de la interfaz explícitamente (especificando el nombre de la interfaz antes del nombre del miembro), puedes acceder a ese miembro solo usando esa interfaz . Básicamente, si lo haces:
System.Collections.Specialized.StringDictionary IWorkItemControl.Properties
{
get { return properties; }
set { properties = value; }
}
No puedes hacer
MyClass x = new MyClass();
var test = x.Properties; // fails to compile
// You should do:
var test = ((IWorkItemControl)x).Properties; // accessible through the interface
Hay varios casos de uso para EII. Por ejemplo, desea proporcionar un método Close
para que su clase libere los recursos adquiridos, pero aún así desea implementar IDisposable
. Podrías hacerlo:
class Test : IDisposable {
public void Close() {
// Frees up resources
}
void IDisposable.Dispose() {
Close();
}
}
De esta manera, los consumidores de la clase solo pueden llamar a Close
directamente (y ni siquiera verán la lista de Disose in Intellisense), pero aún puede usar la clase Test
cualquier lugar donde se IDisposable
una IDisposable
(por ejemplo, en una declaración de using
).
Otro caso de uso para EII es proporcionar diferentes implementaciones de un miembro de interfaz con un nombre idéntico para dos interfaces:
interface IOne {
bool Property { get; }
}
interface ITwo {
string Property { get; }
}
class Test : IOne, ITwo {
bool IOne.Property { ... }
string ITwo.Property { ... }
}
Como puede ver, sin EII ni siquiera es posible implementar ambas interfaces de este ejemplo en una sola clase (ya que las propiedades difieren solo en el tipo de retorno). En otros casos, es posible que desee proporcionar un comportamiento diferente para las vistas individuales de una clase a través de diferentes interfaces.