typescript टाइपस्क्रिप्ट में शुद्ध सार वर्ग को लागू करने के लिए बनाम बनाम




abstract-class extends (4)

मान लीजिए मेरे पास एक शुद्ध अमूर्त वर्ग है (यानी, किसी भी कार्यान्वयन के बिना एक अमूर्त वर्ग):

abstract class A {
    abstract m(): void;
}

सी # और जावा की तरह, मैं अमूर्त वर्ग का विस्तार कर सकता हूं :

class B extends A {
    m(): void { }
}

लेकिन सी # और जावा के विपरीत , मैं सार वर्ग को भी कार्यान्वित कर सकता हूं:

class C implements A {
    m(): void { }
}

कक्षा B और C अलग तरीके से कैसे व्यवहार करते हैं? मैं एक बनाम दूसरे का चयन क्यों करूं?

(वर्तमान में, टाइपस्क्रिप्ट handbook और भाषा विनिर्देश सार वर्गों को शामिल नहीं करते हैं।)


@ Toskv के उत्तर पर बिल्डिंग, यदि आप एक अमूर्त वर्ग का विस्तार करते हैं , तो आपको उप-वर्ग के निर्माता में super() को कॉल करना होगा। यदि आप अमूर्त वर्ग को लागू करते हैं, तो आपको super() को कॉल करने की आवश्यकता नहीं है (लेकिन आपको निजी विधियों सहित अमूर्त वर्ग में घोषित सभी विधियों को लागू करना होगा)।

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


उदाहरण के उदाहरण में आप देते हैं कि आप वास्तव में कक्षा में कुछ भी नया नहीं जोड़ते हैं। तो यह कुछ भी नहीं बढ़ाया गया है। यद्यपि कुछ भी नहीं बढ़ाना वैध टाइपस्क्रिप्ट है, यह मुझे लगता है कि इस मामले में 'उपकरण' अधिक उपयुक्त होगा। लेकिन दिन के अंत में वे बराबर हैं।


उपकरण कीवर्ड ए क्लास को एक इंटरफ़ेस के रूप में मानता है, जिसका अर्थ है कि सी को ए में परिभाषित सभी विधियों को लागू करना है , इससे कोई फर्क नहीं पड़ता कि उनके पास कार्यान्वयन है या नहीं। इसके अलावा सी में सुपर विधियों के लिए कोई कॉल नहीं है

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

मुझे लगता है कि अमूर्त तरीकों के मामले में इससे कोई फर्क नहीं पड़ता है। लेकिन आपके पास शायद ही कभी सार तत्वों के साथ एक वर्ग है , यदि आप ऐसा करते हैं तो इसे केवल एक इंटरफेस में बदलने के लिए बेहतर होगा।

जेनरेट कोड को देखकर आप इसे आसानी से देख सकते हैं। मैंने here एक खेल का मैदान उदाहरण बनाया here


मुझे यहां नेतृत्व किया गया था क्योंकि मैं खुद से एक ही सवाल पूछ रहा था और जवाब पढ़ने के दौरान यह मुझे बताया गया कि विकल्प ऑपरेटर के instanceof को भी प्रभावित करेगा।

चूंकि एक अमूर्त वर्ग एक वास्तविक मान है जो जेएस को उत्सर्जित करता है, इसे उप-वर्ग के विस्तार के दौरान रनटाइम चेक के लिए उपयोग किया जा सकता है।

abstract class A {}

class B extends A {}

class C implements A {}

console.log(new B() instanceof A) // true
console.log(new C() instanceof A) // false




implements