2011-01-28 12 views
14
public class SuperCar: Car 
{ 
    public bool SuperWheels { get {return true; } } 
} 

public class Car 
{ 
    public bool HasSteeringWheel { get {return true;} } 
} 

मैं व्युत्पन्न सुपरकार के लिए बेस क्लास कैसे सेट कर सकता हूं?व्युत्पन्न और बेस क्लास, क्या मैं आधार को स्पष्ट रूप से सेट कर सकता हूं?

public void SetCar(Car car) 
{ 
SuperCar scar = new SuperCar(); 
car.Base = car; 
} 

असल में, अगर मैं कार वस्तुओं है, मैं नहीं चाहता कि मैन्युअल रूप से सेटअप करने के लिए कार के हर संपत्ति के माध्यम से पुनरावृति करना चाहते हैं:

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

+2

** नहीं। ** संक्षिप्त कारण: कोई अलग आधार वस्तु * नहीं है। '(ऑब्जेक्ट) यह == (ऑब्जेक्ट) बेस' हमेशा सत्य है। हालांकि प्रतिबिंब (और अन्य माध्यमों) द्वारा क्लोनिंग/प्रतिलिपि करने के तरीके हैं। शायद वर्णन करें कि * वास्तव में * क्या चाहता है :) –

+0

जबकि प्रश्न प्रतिबिंब (या एक प्रति-निर्माता) के बारे में नहीं पूछता है, इसलिए मैंने उम्मीदों को संबंधित प्रश्नों की एक और दिलचस्प सूची उत्पन्न करने के लिए जोड़ा। का आनंद लें। (http://stackoverflow.com/questions/3072518/can-reflection-be-used-to-instantiate-an-objects-base-class-properties विशेष रूप से दिलचस्प लगते हैं, और शायद डुप्लिकेटिव) –

+0

मुझे संदेह है कि आप मान रहे हैं कि आप सी # एक * प्रोटोटाइप विरासत * भाषा है। यह नहीं। क्या आपके पास जावास्क्रिप्ट में प्रोग्रामिंग में पृष्ठभूमि है? –

उत्तर

0

कुल मिलाकर बहुत सारी सहायक टिप्पणियां। मुझे लगता है कि संक्षिप्त जवाब पीएसटी द्वारा दिया गया था और मुझे लगता है कि यह सही है:

नहीं संक्षिप्त कारण: कोई अलग आधार वस्तु नहीं है। (ऑब्जेक्ट) यह == (ऑब्जेक्ट) आधार हमेशा सत्य है। हालांकि प्रतिबिंब (और अन्य माध्यमों) द्वारा क्लोनिंग/प्रतिलिपि करने के तरीके हैं।शायद वर्णन करें कि वास्तव में क्या चाहता था

तो, ऑटोमैपर टूल का उपयोग करने का उनका सुझाव भी अविश्वसनीय रूप से उपयोगी था और मूल रूप से जो मैं खोज रहा था।

3

यह संभव नहीं है।

आपको गुण मैन्युअल रूप से सेट करने की आवश्यकता है।

+0

आइए कहें कि मेरे पास एक व्यक्ति वर्ग है, और निश्चित रूप से हजारों डेटा आइटम हैं जो व्यक्ति वर्ग का प्रतिनिधित्व करते हैं। व्यक्ति वर्ग दस हजार गुणों को परिभाषित करता है। अब, मेरे पास एक व्यक्ति आईडी है जो विशेष व्यक्ति वर्ग से संबद्ध होती है जिसे मैं प्राप्त करना चाहता हूं और व्यक्ति से उत्तराधिकारी "जॉन" वर्ग बनाना चाहता हूं। अब मैं एक विशेष व्यक्ति आईडी जानता हूं जिसे मैं पास करना चाहता हूं और वह "जॉन" का आधार होगा। – Watson

+0

आप विरासत का उपयोग करने के बजाय एक रैपर बना सकते हैं। – SLaks

3

मैं सही ढंग से अपने प्रश्न समझ रहा हूँ (और मैं पूरी तरह यकीन है कि मैं कर रहा हूँ नहीं कर रहा हूँ), तो आप एक तरह से व्यवहार कुछ इस तरह करने से आप चाहते हैं प्राप्त कर सकते हैं: आप

class Car { 
    public bool CarProperty { get; set; } 
    // regular constructor 
    public Car() { 

    } 
    // "copy" constructor 
    public Car(Car c) { 
     CarProperty = c.CarProperty; 
    } 
} 

class SuperCar : Car { 
    public bool SuperCarProperty { get; set; } 
    // regular constructor 
    public SuperCar() { 
    } 
    // "copy" constructor 
    public SuperCar(Car c) : base(c) { 
     SuperCar sc = c as SuperCar; 
     if(sc != null) { 
      SuperCarProperty = sc.SuperCarProperty; 
     } 
    } 

फिर जब वे नहीं करना चाहिए

public void SetCar(Car car) { 
    SuperCar scar = new SuperCar(car); 
} 

नोट आप अपने "प्रतिलिपि" निर्माता इस तरह से कि दो वस्तुओं का हिस्सा एक ही सदस्य (संदर्भ) में गुण कॉपी करने के लिए नहीं बहुत सावधान रहना होगा कि ऐसा कर सकते हैं।

मुझे यह पूछना है कि, आपका लक्ष्य इस के साथ क्या है?

+0

मेरा लक्ष्य सरल है। असल में, वास्तविक जीवन में सुपरकार में शायद 100 गुण होंगे। तो मान लें कि अब मैं सुपरकार्स का डेटाबेस बनाए रखता हूं।अब, मैं सुपरकार्स से उत्तराधिकारी बनना चाहता हूं लेकिन मैं सुपरकार्स की बेस क्लास को पास करना चाहता हूं जिसे मैंने पहले से ही कमजोर संयोजन के लिए बनाया है। जब मैंने पहले ही मूल प्रकार बनाया है तो मैं 100 गुण मैन्युअल रूप से सेट नहीं करना चाहता हूं। – Watson

+0

लगता है जैसे आपको सुपरकार्स को छोटी वस्तुओं में तोड़ने की ज़रूरत है। फिर ऑब्जेक्ट्स जो सुपरकार्स के बीच समान हैं साझा की जा सकती हैं। – siride

+0

मैं सी # में विरासत की मेरी समझ से अधिक चिंतित हूं। यह मुझे लगता है कि, यदि कक्षा ए कक्षा बी से निकला है, तो आप बी पर बी सेट करने में सक्षम होना चाहिए। इसलिए यदि आपके पास ए श्रेणी का उदाहरण है तो आपको एबी = नया बी() कहने में सक्षम होना चाहिए; – Watson

0

सबसे पहले, प्रत्येक सुपरकार ऑब्जेक्ट दूसरे से अलग है। विरासत आपको संबंधित वस्तुओं के सामान्य व्यवहार को परिभाषित करने में मदद करता है, इसका मतलब यह नहीं है कि वे एक ही वस्तुएं हैं। किसी प्रकार की प्रत्येक वस्तु की अपनी निर्माण प्रक्रिया होती है। एक बच्चे की वस्तु बनने से पहले, आधार वर्ग का उद्देश्य विरासत पदानुक्रम के अनुसार बनाया गया है। यदि आप सभी सुपरकार ऑब्जेक्ट्स के लिए एक सामान्य संपत्ति का उपयोग करना चाहते हैं, तो आपको सुपरकायर इंस्टेंस के भीतर कार ऑब्जेक्ट का एक अलग उदाहरण बनाए रखना होगा, सुपर कार में कार ऑब्जेक्ट में सामान्य कार ऑब्जेक्ट असाइन करना होगा और बेस कार से प्राप्त गुणों को ओवरराइड करना होगा ऑब्जेक्ट और इसे प्रोप पर रीडायरेक्ट करें। आंतरिक कार वस्तु का।

public class SuperCar: Car 
{ 
    public bool SuperWheels { get {return true; } } 

    Car carInstance = null; 
    public void SetCar(Car car) 
    { 
     carInstance = car; 
    } 
} 

लेकिन मुझे विश्वास है कि इस डिजाइन के साथ आप कुछ करना चाहते हैं। यदि आप हमें बड़ी तस्वीर जान सकते हैं कि आप ऐसा क्यों करना चाहते हैं, तो हम आपकी आवश्यकता को पूरा करने के लिए बेहतर डिज़ाइन के साथ आ सकते हैं।

0

आप केवल किसी अन्य वर्ग की सामग्री कॉपी कर सकते हैं, लेकिन इसे सीधे सेट नहीं कर सकते हैं। कॉपी कन्स्ट्रक्टर कहलाता है इसका उपयोग करके नीचे उदाहरण देखें।

class Car 
{ 
    string model; 
    public Car(string model) { this.model = model; } 
    protected Car(Car other) { this.model = other.model; } 
    string Model { get; set; } 
} 

class SuperCar 
{ 
    public SuperCar(Car car) : base(car) { } 
    public SuperCar(string model) : base(model) { } 
    bool IsTurbo { get; set; } 
} 

कुंजी कीवर्ड base() निर्माता घोषणा के बाद है।

9

मैं उपवर्ग में कुछ इस तरह का उपयोग करें और यह मेरे लिए ठीक काम करता है:

using System.Reflection; 
. 
. 
. 
/// <summary> copy base class instance's property values to this object. </summary> 
private void InitInhertedProperties (object baseClassInstance) 
{ 
    foreach (PropertyInfo propertyInfo in baseClassInstance.GetType().GetProperties()) 
    { 
     object value = propertyInfo.GetValue(baseClassInstance, null); 
     if (null != value) propertyInfo.SetValue(this, value, null); 
    } 
} 
+0

हां। यह सही था। – Watson

0

आप कॉपी से परिलक्षित गुण बिल्डर पैटर्न लागू करने का प्रयास अधिक नियंत्रण चाहते हैं, तो। टी बेस क्लास से प्राप्त कोई भी वर्ग हो सकता है।

public static T BuildNew<T>(BaseClass baseClass) where T : BaseClass, new() 
{ 
    return new T 
    { 
     Property1 = baseModel.Property1, 
     Property2 = baseModel.Property2, 
    }; 
} 
संबंधित मुद्दे

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