इस कोड को देखते हुए:जड़ समर्थन विशेषता ऑब्जेक्ट अपस्टिंग क्यों नहीं करता है?
trait Base {
fn a(&self);
fn b(&self);
fn c(&self);
fn d(&self);
}
trait Derived : Base {
fn e(&self);
fn f(&self);
fn g(&self);
}
struct S;
impl Derived for S {
fn e(&self) {}
fn f(&self) {}
fn g(&self) {}
}
impl Base for S {
fn a(&self) {}
fn b(&self) {}
fn c(&self) {}
fn d(&self) {}
}
दुर्भाग्य से, मैं &Base
करने के लिए &Derived
डाली नहीं कर सकता। मैं सोच रहा था कि ऐसा क्यों था, क्योंकि Derived
vtable को Base
विधियों को एक तरफ या किसी अन्य तरीके से संदर्भित करना है।
खैर, LLVM आईआर निरीक्षण से पता चलता है निम्नलिखित:
@vtable4 = internal unnamed_addr constant {
void (i8*)*,
i64,
i64,
void (%struct.S*)*,
void (%struct.S*)*,
void (%struct.S*)*,
void (%struct.S*)*
} {
void (i8*)* @_ZN2i813glue_drop.98717h857b3af62872ffacE,
i64 0,
i64 1,
void (%struct.S*)* @_ZN6S.Base1a20h57ba36716de00921jbaE,
void (%struct.S*)* @_ZN6S.Base1b20h3d50ba92e362d050pbaE,
void (%struct.S*)* @_ZN6S.Base1c20h794e6e72e0a45cc2vbaE,
void (%struct.S*)* @_ZN6S.Base1d20hda31e564669a8cdaBbaE
}
@vtable26 = internal unnamed_addr constant {
void (i8*)*,
i64,
i64,
void (%struct.S*)*,
void (%struct.S*)*,
void (%struct.S*)*,
void (%struct.S*)*,
void (%struct.S*)*,
void (%struct.S*)*,
void (%struct.S*)*
} {
void (i8*)* @_ZN2i813glue_drop.98717h857b3af62872ffacE,
i64 0,
i64 1,
void (%struct.S*)* @_ZN9S.Derived1e20h9992ddd0854253d1WaaE,
void (%struct.S*)* @_ZN9S.Derived1f20h849d0c78b0615f092aaE,
void (%struct.S*)* @_ZN9S.Derived1g20hae95d0f1a38ed23b8aaE,
void (%struct.S*)* @_ZN6S.Base1a20h57ba36716de00921jbaE,
void (%struct.S*)* @_ZN6S.Base1b20h3d50ba92e362d050pbaE,
void (%struct.S*)* @_ZN6S.Base1c20h794e6e72e0a45cc2vbaE,
void (%struct.S*)* @_ZN6S.Base1d20hda31e564669a8cdaBbaE
}
सभी जंग vtables पहले खेतों में नाशक, आकार और संरेखण के लिए सूचक होते हैं, और जब supertrait तरीकों को संदर्भित subtrait vtables उन्हें नकल नहीं है, न ही सुपरर्ट्रेट vtables के अप्रत्यक्ष संदर्भ का उपयोग करें। वे सिर्फ विधि पॉइंटर्स verbatim की प्रतियां हैं और कुछ भी नहीं।
है कि डिजाइन को देखते हुए यह समझने के लिए क्यों यह काम नहीं करता आसान है। रनटाइम में एक नया vtable निर्माण करने की आवश्यकता होगी, जो संभवतः ढेर पर रहेंगे, और यह वास्तव में एक सुरुचिपूर्ण (या इष्टतम) समाधान नहीं है।
वहाँ कुछ समाधान जाहिर है, इंटरफ़ेस करने के लिए स्पष्ट Upcast विधियां जोड़ने की तरह हैं, लेकिन यह ठीक से काम करने के लिए काफी बॉयलरप्लेट (या मैक्रो उन्माद) का एक सा की आवश्यकता है।
अब, सवाल यह है कि - क्यों यह किसी तरह कि विशेषता वस्तु upcasting सक्षम होगा में लागू नहीं किया गया? जैसे, subtrait के vtable में सुपरर्ट्रेट के vtable में एक पॉइंटर जोड़ना। अभी के लिए, जंग का गतिशील प्रेषण LSP को संतुष्ट नहीं करता है, जो वस्तु-उन्मुख डिजाइन के लिए एक बहुत ही बुनियादी सिद्धांत है।
बेशक आप स्थिर प्रेषण का उपयोग कर सकते हैं, जो वास्तव में जंग में उपयोग करने के लिए बहुत ही सुरुचिपूर्ण है, लेकिन यह आसानी से कोड ब्लोट की ओर जाता है जो कभी-कभी कम्प्यूटेशनल प्रदर्शन की तुलना में अधिक महत्वपूर्ण होता है - जैसे एम्बेडेड सिस्टम पर, और जंग डेवलपर्स ऐसे समर्थन का दावा करने का दावा करते हैं भाषा के मामलों का प्रयोग करें। इसके अलावा, कई मामलों में आप सफलतापूर्वक ऐसे मॉडल का उपयोग कर सकते हैं जो शुद्ध ओओ नहीं है, जिसे जंग के कार्यात्मक डिजाइन द्वारा प्रोत्साहित किया जाता है। फिर भी, जंग कई उपयोगी ओओ पैटर्न का समर्थन करता है ... तो एलएसपी क्यों नहीं?
किसी को भी इस तरह के डिजाइन के पीछे तर्क यह पता है?
एक साइड नोट के रूप में: जंग वस्तु-उन्मुख भाषा नहीं है। लक्षण इंटरफेस नहीं हैं, वे हास्केल से टाइप क्लास की तरह हैं। जंग में उप-प्रकार भी नहीं होता है, इसलिए एलएसपी इसके लिए कुछ हद तक अक्षम नहीं है क्योंकि इसकी परिभाषा उप-संबंध संबंध से जुड़ी हुई है। –
फिर भी, जैसा कि मैंने कहा था, जंग कई ओओ-स्टाइल एब्स्ट्रैक्शन का समर्थन करता है, और गुणों को विरासत में रखने की अनुमति है, जो कि एक प्रकार के पदानुक्रम के समान कुछ बनाते हैं। मेरे लिए, लक्षण वस्तुओं के लिए एलएसपी का समर्थन करना स्वाभाविक प्रतीत होता है, भले ही ओओ भाषा का मुख्य प्रतिमान न हो। – kFYatek
कृपया उपयोगी उत्तरों को उतारने और एक उत्तर को स्वीकार करने के लिए सुनिश्चित करें यदि यह आपकी समस्या का समाधान करता है! यदि कोई जवाब स्वीकार्य नहीं है, तो टिप्पणियों को छोड़कर विचार करें कि समस्या को अलग करने के लिए अपने प्रश्न को क्यों संपादित करें या संपादित करें। – Shepmaster