विचार करें कि क्या क्षमताओं के विभिन्न संयोजनों के साथ वस्तुओं का संग्रह करना आम होगा, और क्या कोड उन वस्तुओं पर कार्रवाई करना चाहते हैं , जो एक संग्रह के भीतर हैं, जो इसका समर्थन करते हैं । यदि ऐसा है, और अगर वस्तुओं के लिए एक समझदार "डिफ़ॉल्ट व्यवहार" होगा जो कुछ कार्रवाई के लिए उपयोगी समर्थन नहीं है, तो यह वर्गों की एक विस्तृत श्रृंखला द्वारा लागू इंटरफेस के लिए उपयोगी हो सकता है, न कि केवल उन लोगों के लिए जो उपयोगी व्यवहार कर सकते हैं।
उदाहरण के लिए, मान लें कि केवल कुछ प्रकार के प्राणी Woozles हो सकते हैं, और एक व्यक्ति चाहता है कि उसके पास एक NumerOfWoozles
संपत्ति हो। यदि ऐसी संपत्ति एक ऐसे इंटरफ़ेस में थी जो केवल जीवों द्वारा लागू की गई थी, जिसमें Woozles हो सकते हैं, तो कोड जो मिश्रित प्रकार के प्राणियों के संग्रह द्वारा आयोजित Woozles की कुल संख्या का पता लगाना चाहता था, उसे कुछ कहना होगा:
int total = 0;
foreach (object it in creatures)
{
IWoozleCountable w = trycast(it, IWoozleCountable);
if (w != null) total += w.WoozleCount;
}
यदि, हालांकि, WoozleCount प्राणी / ICreature का सदस्य था, भले ही कुछ उपप्रकार प्राणी के डिफ़ॉल्ट WoozleCount कार्यान्वयन को हमेशा के लिए समाप्त कर देगा, जो कोड को शून्य देता है:
int total = 0;
foreach (ICreature it in creatures)
total += it.WoozleCount;
हालांकि कुछ लोग प्रत्येक प्राणी को एक WoozleCount संपत्ति को लागू करने के विचार पर झगड़ सकते हैं, जो वास्तव में केवल कुछ उपप्रकारों के लिए उपयोगी है, संपत्ति सभी प्रकारों के लिए सार्थक होगी , चाहे वह उन प्रकारों से ज्ञात वस्तुओं के साथ उपयोगी हो, या नहीं और मैं "किचन सिंक" इंटरफेस के संबंध में कोशिश करूंगा कि कोडकोर ऑपरेटर की तुलना में कोड गंध कम हो।
IEnumerable
,IEquatable
आदि