Pertimbangkan apakah akan umum untuk memiliki koleksi objek dengan kombinasi kemampuan yang berbeda, dan apakah kode mungkin ingin melakukan tindakan terhadap item-item itu, dalam koleksi, yang mendukungnya . Jika demikian, dan jika ada "perilaku default" yang masuk akal untuk objek yang tidak memiliki dukungan yang berguna untuk beberapa tindakan, mungkin bermanfaat untuk memiliki antarmuka yang diimplementasikan oleh berbagai kelas, bukan hanya mereka yang dapat berperilaku bermanfaat.
Sebagai contoh, anggaplah hanya beberapa jenis makhluk yang dapat memiliki Woozles, dan seseorang ingin makhluk seperti itu memiliki NumerOfWoozles
properti. Jika properti seperti itu berada di antarmuka yang hanya diterapkan oleh makhluk yang dapat memiliki Woozles, maka kode yang ingin menemukan jumlah total Woozles yang dipegang oleh kumpulan makhluk dari jenis campuran harus mengatakan sesuatu seperti:
int total = 0;
foreach (object it in creatures)
{
IWoozleCountable w = trycast(it, IWoozleCountable);
if (w != null) total += w.WoozleCount;
}
Namun, jika WoozleCount adalah anggota Creature / ICreature, meskipun beberapa subtipe akan mengesampingkan implementasi WoozleCount default Creature yang selalu mengembalikan nol, kode dapat disederhanakan menjadi:
int total = 0;
foreach (ICreature it in creatures)
total += it.WoozleCount;
Sementara beberapa orang mungkin kecewa dengan gagasan bahwa setiap makhluk menerapkan properti WoozleCount yang benar-benar hanya berguna untuk beberapa subtipe, properti itu akan bermakna untuk semua jenis, apakah itu akan berguna atau tidak dengan item yang diketahui jenisnya, dan saya akan menganggap antarmuka "kitchen sink" kurang berbau kode daripada operator trycast.
IEnumerable
,IEquatable
, dll