Xem xét liệu có phổ biến để có các bộ sưu tập các đối tượng với các kết hợp khả năng khác nhau hay không và liệu mã có thể muốn thực hiện một hành động đối với các mục đó, trong một bộ sưu tập, có hỗ trợ nó không . Nếu vậy, và nếu có một "hành vi mặc định" hợp lý cho các đối tượng không có hỗ trợ hữu ích cho một số hành động, thì có thể hữu ích khi các giao diện được triển khai bởi một loạt các lớp, không chỉ các hành vi có thể hành xử hữu ích.
Ví dụ, giả sử chỉ có một vài loại sinh vật có thể có Woozles và người ta muốn những sinh vật đó có NumerOfWoozles
tài sản. Nếu một tài sản như vậy nằm trong một giao diện chỉ được thực hiện bởi các sinh vật có thể có Woozles, thì mã muốn tìm tổng số Woozles được giữ bởi một bộ sưu tập các loại sinh vật hỗn hợp sẽ phải nói điều gì đó như:
int total = 0;
foreach (object it in creatures)
{
IWoozleCountable w = trycast(it, IWoozleCountable);
if (w != null) total += w.WoozleCount;
}
Tuy nhiên, nếu WoozleCount là thành viên của Creature / ICreature, mặc dù một vài kiểu con sẽ ghi đè lên triển khai WoozleCount mặc định của Creature luôn trả về 0, mã có thể được đơn giản hóa thành:
int total = 0;
foreach (ICreature it in creatures)
total += it.WoozleCount;
Mặc dù một số người có thể an tâm với ý tưởng rằng mọi Sinh vật đều thực hiện một thuộc tính WoozleCount thực sự chỉ hữu ích cho một vài kiểu con, nhưng thuộc tính đó sẽ có ý nghĩa đối với tất cả các loại, cho dù nó có hữu ích với các loại vật phẩm đó hay không, và tôi sẽ coi giao diện "bồn rửa nhà bếp" là ít mùi mã hơn so với toán tử trycast.
IEnumerable
,IEquatable
vv