Интерфейсы не могут полностью скрыть родительские интерфейсы, но класс реализации может, что может быть полезно.
Рассмотрим класс MyStringList
, который является списком только для чтения, который реализует IList<string>
. Для простоты мы будем использовать его как простой проход: некоторые из членов довольно бессмысленны, поэтому мы можем сделать следующее:
//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.");
}
Кто-то, имеющий дело с интерфейсом с MyStringList
по IList<string>
, должен иметь возможность вызывать эти бессмысленные элементы, но нет необходимости для кого-то, имеющего дело с MyStringList
, делать это.
Теперь, когда это возможно для класса, интерфейс может навязать такое значение классу путем сопоставления имени родительского интерфейса. Примером класса является IEnumberable<T>
, где GetEnumerator()
совпадает с классом IEnumerable
, от которого он наследуется. Следовательно, класс может неявно реализовывать только один и должен скрывать другой или оба (поскольку один всегда может привести результат (IEnumerator<T>
) к типу результата другого (IEnumerator
), то наиболее разумным поведением обычно является неявная реализация версия IEnumberable<T>
и явно реализует IEnumerable
одну (обычно путем возврата результата другой версии).
Однако, в то время как сокрытие вынуждает быть скрытым по крайней мере один, нет ничего, что могло бы заставить этот конкретный выбор в отношении того, какой (если он есть) неявно реализован, кроме того, что один имеет настолько очевидное преимущество перед другим, что немногие поступили бы иначе.
person
Jon Hanna
schedule
25.08.2010