2008-12-18 15 views
12

मैं सच में यकीन है कि कैसे करने के लिए शीर्षक इस सवाल लेकिन मूल रूप से मैं इस तरह एक अंतरफलक है नहीं कर रहा हूँ:विरासत डिजाइन। अच्छा अभ्यास?

public interface IFoo 
{ 
    string ToCMD(); 
} 

absract वर्गों के एक जोड़े जो की तरह IFoo लागू:

public abstract class Foo : IFoo 
{ 
    public abstract string ToCMD(); 
} 

public abstract class Bar : IFoo 
{ 
    public abstract string ToCMD(); 
} 

तो वर्ग है जो वारिस फू और बार:

public class FooClass1 : Foo 
{ 
    public override string ToCMD() 
    {return "Test";} 
} ///there are about 10 foo classes. 

public class BarClass : Bar 
{ 
    public override string ToCMD() 
    {return "BarClass";} 
} ///about the same for bar classes. 

मैं यह कर रहा हूँ ताकि जब मैं की तरह अपने कस्टम सूची है:

public class Store<T> : List<T> where T : IFoo {} 

मैं फिर उस प्रकार को प्रतिबंधित कर सकता हूं जो इसमें जाता है लेकिन इंटरफ़ेस होने से यह अभी भी किसी भी प्रकार का IFoo ले जाएगा।

कुछ की तरह:

Store<Foo> store = new Store<Foo>(); //Only Foo types will work. 
store.Add(new FooClass1()); //Will compile. 

Store<IFoo> store = new Store<IFoo>(); //All IFoo types will work. 
store.Add(new FooClass1()); //Will compile. 
store.Add(new BarClass()); //Will compile. 

मेरे सवाल यह है: यह इस बारे में जाने का एक ठीक तरीका है? या कोई बेहतर तरीका है?

संपादित करें: Picture-> alt text

उत्तर

6

एक विरासत श्रृंखला के लिए की जरूरत है यह सार (वीबी भाषा में MustInherit) बनाने के सामान्य रूप में संदिग्ध, है।

हालांकि एक इंटरफेस के साथ एक सार आधार वर्ग के संयोजन के विशिष्ट परिदृश्य .. मैं इसे इस तरह देखें:

आप इस तरह एक सार आधार वर्ग है, तो आप भी एक इसी इंटरफेस होना चाहिए। यदि आपके पास इंटरफ़ेस है, तो केवल सार बेस क्लास का उपयोग करें जहां विरासत श्रृंखला समझदार है।

कहा, अगर मैं एक पुस्तकालय लिख रहा हूँ और यह मेरा एपीआई/फ्रेमवर्क का हिस्सा है, मैं आम तौर पर एक "डिफ़ॉल्ट कार्यान्वयन" है कि एक आधार वर्ग के रूप में इस्तेमाल किया जा सकता शामिल होंगे। यह एक बेवकूफ, सामान्य तरीके से इंटरफ़ेस विधियों को लागू करेगा, जहां संभव हो, और बाकी के रूप में आवश्यकतानुसार लागू/ओवरराइड करने के लिए विरासतकर्ताओं को छोड़ दें।

यह लोग हैं, जो एक कार्यात्मक उदाहरण है कि क्या वे पहले से ही लागू करने की आवश्यकता के सबसे को कवर कर सकते प्रदान करके इंटरफ़ेस को लागू करना चाहते हैं की सहायता के लिए पुस्तकालय की बस एक सुविधा की सुविधा है, हालांकि।

संक्षेप में, इंटरफ़ेस आधार वर्ग से अधिक मूल्यवान है, लेकिन एक आधार वर्ग बहुत समय बचाने के लिए और गाड़ी इंटरफेस कार्यान्वयन को कम कर सकते हैं।

1

ठीक है, कि क्या जहां कीवर्ड के लिए है। यह सुनिश्चित करने के लिए कि आपको अपनी विरासत की गहराई आवश्यक है, आपको शायद अपने ऑब्जेक्ट मॉडल का मूल्यांकन करने की आवश्यकता है। गहरी विरासत पदानुक्रम परियोजनाओं को जटिल बनाते हैं और आमतौर पर एक लाल झंडा होते हैं, लेकिन यह स्थिति पर निर्भर करता है।

आमतौर पर, आपको सूचियों के बारे में बात करने वाली कार्यक्षमता को दूर करने के लिए अमूर्त वर्ग की आवश्यकता नहीं होती है, और इंटरफेस टाइप प्रतिबंधों को निर्दिष्ट करने के लिए 'पसंदीदा' विधि हैं। यदि आप सामान्य कार्यक्षमता को समाहित करना चाहते हैं तो मैं केवल आपकी कक्षा के सार संस्करण का उपयोग करूंगा।

संक्षिप्त उत्तर: सुनिश्चित करें कि आप विरासत पागल नहीं जा रहे हैं।

आशा है कि मदद करता है!

1

आप इंटरफेस का भी उपयोग कर सकते हैं। एक अमूर्त वर्ग का उपयोग करने का कोई कारण नहीं है।

public interface Foo : IFoo 
{ 
} 

public interface Bar : IFoo 
{ 
} 
+0

मुझे यकीन नहीं था कि खाली इंटरफेस का उपयोग करना एक अच्छा विचार था। क्या यह? –

+0

@ [नाथन डब्ल्यू]: एक खाली इंटरफ़ेस में कोई बात नहीं है, मुझे लगता है कि gcores केवल संक्षिप्त हो रहा है –

+0

जो मैंने सोचा था, लेकिन मैं बस जांच कर रहा था। –

0

मैं काफी यकीन नहीं है अगर यह है कि आप क्या देख रहे हैं, लेकिन शायद आप क्या करना चाहते हैं सब एक साथ इंटरफेस स्क्रैप और यह कर रहा है: में

अन्य सदस्यों
abstract class Base 
{ 
    public abstract string ToCMD(); 
} 

abstract class Foo : Base { } 

abstract class Bar : Base { } 

उम्मीद है कि आप है Foo और Bar कक्षाएं! इससे आप अपने कस्टम संग्रह को Base तक सीमित कर सकते हैं या केवल सादा List<Base> का उपयोग कर सकते हैं।

1

आपको इंटरफ़ेस की आवश्यकता है; आपको अमूर्त वर्ग की आवश्यकता हो सकती है या नहीं।

सामान्य रूप से, यदि आप बेस क्लास में कुछ उपयोगी व्यवहार प्रदान कर सकते हैं, तो बेस क्लास प्रदान करें; अगर आधार वर्ग अपने आप में पूरा नहीं हुआ है तो

अन्यथा, इंटरफ़ेस पर्याप्त

संबंधित मुद्दे