2016-03-14 9 views
27

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

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

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

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

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

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

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

(वर्तमान में, टाइपप्रति handbook और language specification सार वर्गों को कवर नहीं है।)

+0

अब टाइपस्क्रिप्ट हैंडबुक में सार कक्षाओं पर एक अनुभाग है। https://www.typescriptlang.org/docs/handbook/classes.html इस प्रश्न के लिए धन्यवाद! मुझे नहीं पता था कि टीएस में 'अमूर्त' उपलब्ध था और इससे मुझे समझने में मदद मिली। – theUtherSide

उत्तर

33

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

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

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

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

+3

यदि 'ए' एक शुद्ध अमूर्त वर्ग है, तो शायद 'केवल उदाहरण' कीवर्ड का व्यवहार ही एकमात्र अवलोकन अंतर है? मैं मानता हूं कि इंटरफेस शायद शुद्ध अमूर्त वर्गों के लिए बेहतर होगा। हालांकि, कोणीय 2 में, केवल उत्तरार्द्ध को डी प्रदाता टोकन के रूप में उपयोग किया जा सकता है। –

+1

वास्तव में, उदाहरण के बारे में जानकारी देने के लिए धन्यवाद, मैं इसे पूरा करने के उत्तर में जोड़ दूंगा (यदि आप चाहें तो एक संपादन कर सकते हैं)। कोणीय 2 के लिए, मुझे लगता है कि यह एक कोणीय 2 विशिष्ट मुद्दा है। :) – toskv

+0

@toskv, इंटरफ़ेस और कक्षा के लिए 'उपकरण' कीवर्ड की प्रयोज्यता का वर्णन करने के लिए धन्यवाद। उदाहरण के लिए, AngularJS 2.0 इसका उपयोग 'ऑनइनिट' क्लास ('इंटरफ़ेस' के बजाय) को लागू करने के लिए करता है। मैंने चारों ओर देखा है, क्या आपके पास इसका संदर्भ है। मैं इसे टीएस दस्तावेज में स्पष्ट रूप से नहीं देखता हूं। – MoMo

0

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

2

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

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

0

मुझे यहां नेतृत्व किया गया था क्योंकि मैं खुद ही एक ही सवाल पूछ रहा था और जवाब पढ़ने के दौरान यह मुझे बताया गया कि यह विकल्प 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 
संबंधित मुद्दे