2012-03-22 16 views
5

मेरा प्रश्न शायद अच्छी तरह से phrased नहीं है (कैसे उच्च स्तर की कक्षाओं उच्च स्तर डेटा के साथ आधार वर्ग विधि कॉल कर सकते हैं) और यह शायद एक शिकार है, लेकिन यहाँ मैं जानासी # हम स्थिर संपत्ति को ओवरराइड क्यों नहीं कर सकते?

class person { 
    protected static string request = "select * from person where gender in ('male','female')"; 
    public string sharedmethod() 
    { 
     return "the request is" + request; 
    } 
} 

class man:person 
{ 
    override protected static string request = "select person.*,man.* from person,men where mytype in ('male') "; 
    DateTime dateOfFirstCar; 
} 

class woman:person 
{ 
    override protected static string request = "select person.*,woman.* from person,women where mytype in ('female') "; 
    DateTime dateOfFirstITBAG; 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     if (new person().sharedmethod() == new man().sharedmethod()) 
      Console.Write("too bad query is the same in base and dervide class"); 
    } 
} 

एक आदमी एक व्यक्ति
एक औरत है एक व्यक्ति
व्यक्ति, पुरुष, महिला मेरे डेटाबेस में मौजूद है लेकिन विभिन्न प्रश्नों की आवश्यकता है

मैं उन प्रश्नों को डुप्लिकेट नहीं करना चाहता, इसलिए मैंने सोचा कि उन्हें प्रत्येक वर्ग में एक स्थिर संपत्ति में स्टोर करना एक अच्छा विचार था।

मैं कुछ निम्न स्तर सामान (वहाँ लगा नहीं) है कि आधार वर्ग में झूठ (coz मैं नकल नहीं करना चाहती) हो गया और मैं विरासत में मिला herited वर्गों के संदर्भ के साथ आधार वर्ग विधि कॉल करने कक्षाएं चाहते थे

मैं आदमी चाहता हूँ। [विरासत में मिला] somemethod() person.somemethod (निष्पादित करने के लिए), लेकिन चर आदमी से आने के साथ

धन्यवाद

उत्तर

3

एक गैर स्थिर स्थिर स्ट्रिंग को कवर संपत्ति जोड़ें, और संदर्भ है कि संपत्ति इसके बजाए:

class person { 
    private const string request = "select * from person where gender in ('male','female')"; 
    protected virtual string Request {get {return request;}} 
    public string sharedmethod() { 
     return "the request is" + Request; 
    } 
} 

class man:person { 
    private const string request = "select person.*,man.* from person,men where mytype in ('male') "; 
    protected override string Request {get {return request;}} 
    DateTime dateOfFirstCar; 
} 

class woman:person { 
    private const string request = "select person.*,woman.* from person,women where mytype in ('female') "; 
    protected override string Request {get {return request;}} 
    DateTime dateOfFirstITBAG; 
} 
+0

धन्यवाद लेकिन व्यक्ति के लिए पूछताछ के बारे में क्या? – frenchone

+1

@ फ्रैंचोन मैंने उस हिस्से को याद किया। आपको 'abstract' के बजाय संपत्ति 'वर्चुअल' बनाने की आवश्यकता है,' व्यक्ति 'वर्ग में कार्यान्वयन जोड़ें, और व्युत्पन्न कार्यान्वयन में' ओवरराइड 'जोड़ें। – dasblinkenlight

+0

ठीक है मैं कोशिश करूँगा – frenchone

3

आप क्यों नहीं कर सकते? चूंकि .net डिजाइनरों ने निर्णय लिया कि ढांचे में उस सुविधा को जोड़ने के लायक होने की तुलना में यह अधिक परेशानी थी।

अपने डिजाइन से निपटने के लिए के रूप में, वहाँ तरीके इसे बेहतर बनाने के बहुत सारे ... हैं

एक, एक स्थिर सहायक वर्ग है कि के रूप में स्थिर तार में एसक्यूएल रख दिया और एक स्थिर विधि जोड़ने के लिए किया जाएगा इसे वापस करने के लिए, फिर इसे व्यक्ति, मैन वुमन इत्यादि से बुलाएं, व्यक्ति में एक enum और सहायक वर्ग में एक स्थिर GetSql डाल दिया और यह काम किया।

ओह और अपनी स्वीकृति दर को हल करें, अन्यथा लोग आपकी मदद नहीं करेंगे।

+0

> अपने डिजाइन से निपटने के लिए, इसे बेहतर बनाने के कई तरीके हैं ... तो मेरा सवाल है "इसे बेहतर कैसे बनाएं"? > एक स्थिर सहायक वर्ग मैंने सोचा था कि नरक वर्ग बुरा था? – frenchone

+2

कोई वर्ग बुरा नहीं है, आप उन्हें बुराई के लिए उपयोग कर सकते हैं। एक स्थिर कारखाना पैटर्न बुराई है? नेट स्थिर स्थिर वर्गों से भरा चॉक है। तो डेल्फी वीसीएल है और आप उसमें स्थिर तरीकों को पार कर सकते हैं। यदि यह स्पष्ट पठनीय और उद्देश्य के लिए उपयुक्त है तो यह अच्छा है। ओओ ढांचे में कुछ चीजें करने के लिए बस कुछ और समझदार तरीका नहीं है। –

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

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