Интерфейсы не могут полностью скрыть родительские интерфейсы, но реализующий класс может, что может быть полезно.
Рассмотрим класс 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
(обычно возвращая результат другого).
Однако, хотя скрытие заставляет скрыть хотя бы одну, ничего нетзаставить этот конкретный выбор относительно того, какой (если таковой имеется) имплицитно реализован, за исключением одного, имеющего настолько очевидное преимущество перед другим, что немногие могли бы поступить иначе.