Поміркуйте, чи буде загальним колекція об'єктів з різними поєднаннями здібностей та чи може код хотів виконати дію над тими предметами в колекції, які його підтримують . Якщо це так, і якщо існувало б розумне "поведінка за замовчуванням" для об'єктів, які не мають корисної підтримки для певних дій, може бути корисним, щоб інтерфейси реалізувалися широким колом класів, а не лише тими, які можуть вести себе корисно.
Наприклад, припустимо, що лише кілька видів істоти можуть мати Вузлів, і хочеться, щоб такі істоти мали NumerOfWoozles
властивість. Якби така властивість була в інтерфейсі, який реалізовували лише істоти, які можуть мати Woozles, тоді код, який хотів знайти загальну кількість Woozles, що міститься у колекції істот змішаних типів, повинен був би сказати щось на кшталт:
int total = 0;
foreach (object it in creatures)
{
IWoozleCountable w = trycast(it, IWoozleCountable);
if (w != null) total += w.WoozleCount;
}
Якщо ж WoozleCount був членом Creature / ICreature, хоча кілька підтипів перекривали б реалізацію WoozleCount за замовчуванням, яка завжди повертає нуль, код можна було б спростити до:
int total = 0;
foreach (ICreature it in creatures)
total += it.WoozleCount;
У той час як деякі люди могли б натирати на ідеї мати кожна істота реалізувати властивість WoozleCount , що дійсно корисно тільки для декількох підтипів, властивість буде значущим для всіх типів, чи буде це бути корисним з елементами , як відомо, з цих типів, і я вважав би інтерфейс "кухонної раковини" менш запашним кодом, ніж оператор Trycast.
IEnumerable
,IEquatable
і т.д.