Las interfaces no pueden ocultar las interfaces de los padres (tal vez?) por completo, pero la clase implementadora puede, lo que puede ser útil.
Considere una clase MyStringList
que es una lista de solo lectura que implementa IList<string>
. Tendremos como un simple paso a través de la simplicidad: Algunos de los miembros son bastante inútil, por lo que podemos hacer de la siguiente manera:
//implement this one implicitly, as it's useful.
public int Count
{
return _list.Count;
}
//do a half-and-half on the indexer
public string this[int index]
{
get
{
return _list[index];
}
}
string IList<string>.this[int index]
{
get
{
return this[index];
}
set
{
throw new NotSupportedException("Collection is read-only.");
}
}
//hide some pointless ones.
bool ICollection<string>.IsReadOnly
{
get
{
return true;
}
}
void IList<string>.Insert(int index, string item)
{
throw new NotSupportedException("Collection is read-only.");
}
void IList<string>.RemoveAt(int index)
{
throw new NotSupportedException("Collection is read-only.");
}
void ICollection<string>.Add(string item)
{
throw new NotSupportedException("Collection is read-only.");
}
void ICollection<string>.Clear()
{
throw new NotSupportedException("Collection is read-only.");
}
bool ICollection<string>.Remove(string item)
{
throw new NotSupportedException("Collection is read-only.");
}
Alguien trata de la interfaz a través MyStringList
IList<string>
tiene que ser capaz de llamar estos miembros inútiles, pero no es necesario que alguien que se ocupe del MyStringList
lo haga.
Ahora, con esto posible para la clase, una interfaz puede forzar tal implicación en la clase haciendo coincidir el nombre de una interfaz principal. El ejemplo de clase es IEnumberable<T>
donde el GetEnumerator()
coincide con el de IEnumerable
del que hereda. Por lo tanto, la clase puede implementar implícitamente solo uno, y debe ocultar el otro o ambos (ya que uno siempre puede convertir el resultado (un IEnumerator<T>
) en el tipo de resultado del otro (un IEnumerator
), entonces el comportamiento más sensato es implementar implícitamente la versión IEnumberable<T>
, y poner en práctica de manera explícita la IEnumerable
uno (normalmente devolviendo el resultado de la otra).
Sin embargo, mientras que las fuerzas de escondite al menos uno que se oculta, no hay nada para obligar a que la elección particular, en cuanto a que (si Cualquiera) se implementa implícitamente, más allá de que uno tenga una ventaja tan obvia sobre la otra que pocos lo harían de otra manera.
Estoy de acuerdo cuando se trata de clases (incluso en la excepción que das) pero creo que es diferente cuando se trata de interfaces. –