मेरे पास एक सार आधार वर्ग है और मैं एक क्षेत्र या एक संपत्ति घोषित करना चाहता हूं जिसका प्रत्येक वर्ग में एक अलग मूल्य होगा जो इस मूल वर्ग से विरासत में मिला है।
मैं इसे बेसकेल्स में परिभाषित करना चाहता हूं, इसलिए मैं इसे बेस क्लास विधि में संदर्भित कर सकता हूं - उदाहरण के लिए ToString को ओवरराइड करने के लिए यह कहने के लिए कि "यह ऑब्जेक्ट टाइप प्रॉपर्टी / फील्ड का है "। मुझे तीन तरीके मिले हैं जो मैं ऐसा करने के लिए देख सकता हूं, लेकिन मैं सोच रहा था - ऐसा करने का सबसे अच्छा या स्वीकृत तरीका क्या है? नौसिखिया सवाल, क्षमा करें।
विकल्प 1:
एक अमूर्त संपत्ति का उपयोग करें और विरासत में मिली कक्षाओं पर इसे ओवरराइड करें। लागू होने से यह लाभ (आपको इसे ओवरराइड करना होगा) और यह साफ है। लेकिन, किसी क्षेत्र को एनकैप्सुलेट करने के बजाय हार्ड-कोड मान लौटाना थोड़ा गलत लगता है और यह कोड की कुछ पंक्तियों के बजाय है। मुझे "सेट" के लिए एक निकाय भी घोषित करना है, लेकिन यह कम महत्वपूर्ण नहीं है (और संभवत: इससे बचने का एक तरीका है जिसके बारे में मुझे जानकारी नहीं है)।
abstract class Father
{
abstract public int MyInt { get; set;}
}
class Son : Father
{
public override int MyInt
{
get { return 1; }
set { }
}
}
विकल्प 2
मैं एक सार्वजनिक क्षेत्र (या एक संरक्षित क्षेत्र) घोषित कर सकता हूं और विरासत में प्राप्त वर्ग में इसे स्पष्ट रूप से ओवरराइड कर सकता हूं। नीचे दिया गया उदाहरण मुझे "नया" का उपयोग करने की चेतावनी देगा और मैं शायद ऐसा कर सकता हूं, लेकिन यह गलत लगता है और यह बहुरूपता को तोड़ता है, जो पूरे बिंदु था। एक अच्छा विचार नहीं लगता ...
abstract class Mother
{
public int MyInt = 0;
}
class Daughter : Mother
{
public int MyInt = 1;
}
विकल्प 3
मैं एक संरक्षित क्षेत्र का उपयोग कर सकता हूं और निर्माता में मान सेट कर सकता हूं। यह काफी सुव्यवस्थित लगता है लेकिन मुझ पर निर्भर करता है कि कंस्ट्रक्टर हमेशा यह निर्धारित करता है और कई अतिभारित कंस्ट्रक्टरों के साथ हमेशा एक मौका होता है कि कुछ कोड पथ मान सेट नहीं करेगा।
abstract class Aunt
{
protected int MyInt;
}
class Niece : Aunt
{
public Niece()
{
MyInt = 1;
}
}
यह एक सैद्धांतिक सवाल का एक सा है और मुझे लगता है कि उत्तर का विकल्प 1 होना चाहिए क्योंकि यह एकमात्र सुरक्षित विकल्प है लेकिन मैं सिर्फ C # के साथ पकड़ बना रहा हूं और अधिक अनुभव वाले लोगों से यह पूछना चाहता हूं।