मैं एक अमूर्त वर्ग के लिए एक अमूर्त निर्माता कैसे बना सकता हूं?

उदाहरण के लिए, यदि मेरे पास यह अमूर्त वर्ग है:

export abstract class Foo<T> extends Bar<T> {
  constructor(someParam: any) {
    super();
    this.someObj = someParam;
  }
}

फिर इसका सेवन इस वर्ग द्वारा किया जाता है:

export class FooImpl extends Foo<SomeType> {
}

अगर मैं कंस्ट्रक्टर को ओवरराइड नहीं करता तो FooImpl क्लास पर डिफॉल्ट पैरामीटरलेस कंस्ट्रक्टर का इस्तेमाल किया जाएगा जिससे क्लास के भीतर एक अनुचित स्थिति पैदा हो जाएगी।

जब Foo<T> का उपभोग किया जाता है तो मैं एक अमूर्त निर्माता को कैसे परिभाषित कर सकता हूं या अमूर्त वर्ग के उपभोक्ताओं को कन्स्ट्रक्टर को ओवरराइड करने के लिए मजबूर कर सकता हूं?

संपादित करें

मेरे पास सटीक कोड नीचे है और ऐसा प्रतीत होता है कि यह किसी भी तरह बनाम कोड से संबंधित है

export abstract class FireStoreDataSource<T> extends DataSource<T> {
  constructor(store: () => Observable<T[]>) {
    super();
  }
}

फिर मैं इस वर्ग का विस्तार इस प्रकार कर रहा हूँ

export class AssessmentCenterDataSource extends FireStoreDataSource<AssessmentCenter> {
}

फिर कोणीय घटक में एक उदाहरण बनाना ngOnInit

ngOnInit() {
  this.dataSource = new AssessmentCenterDataSource(() => this.service.getData());
}

यहाँ vscode में मुझे कंपाइलर त्रुटि [ts] Expected 0 arguments, but got 1. मिल रही है, हालाँकि जब मैं ng build चलाता हूँ तो यह सही ढंग से बनता है

अगर मैं कंस्ट्रक्टर को कुछ भी पास नहीं करता हूं तो कंपाइलर त्रुटि दूर हो जाती है और जब मैं ng build चलाता हूं तो मुझे एक त्रुटि मिलती है जो कि error TS2554: Expected 1 arguments, but got 0. है

तो ऐसा लगता है कि यह बनामकोड या टाइपस्क्रिप्ट के बजाय मेरे द्वारा इंस्टॉल किए गए ऐडऑन में से एक के साथ एक समस्या हो सकती है

मैं कोणीय 6 के साथ vscode इनसाइडर 1.26.0 और टाइपस्क्रिप्ट इनसाइडर 3.0.1 का उपयोग कर रहा हूं

2
Neil Stevens 18 जुलाई 2018, 13:06
"...फिर डिफ़ॉल्ट पैरामीटर रहित कंस्ट्रक्टर का उपयोग FooImpl वर्ग पर किया जाएगा जो कक्षा के भीतर एक अनुचित स्थिति की ओर ले जाएगा।" यह छोड़कर कि डिफ़ॉल्ट पैरामीटर रहित नहीं होगा, किस तरह से अनुचित है ? सुपर कंस्ट्रक्टर में कोड जरूरी निष्पादित किया जाना चाहिए, यह class सिंटैक्स की आवश्यकता है। यदि आपने उपवर्ग में एक कंस्ट्रक्टर जोड़ा है और super को कॉल नहीं किया है, तो यह एक त्रुटि होगी।
 – 
T.J. Crowder
18 जुलाई 2018, 13:13

2 जवाब

दरअसल टाइपस्क्रिप्ट में यदि आप कंस्ट्रक्टर को ओवरराइड नहीं करते हैं, तो कंस्ट्रक्टर को बेस क्लास के रूप में विरासत में मिला है।

तो आपके मामले में यह अमान्य होगा:

new FooImpl(); // error 

आपको बेस क्लास द्वारा आवश्यक पैरामीटर पास करने के लिए मजबूर होना पड़ेगा:

new FooImpl("") //ok

व्युत्पन्न प्रकार को कंस्ट्रक्टर को ओवरराइड करने के लिए बाध्य करने का कोई तरीका नहीं है, लेकिन चूंकि बेस कंस्ट्रक्टर विरासत में मिला है, इसलिए यह काफी अच्छा लगता है।

खेल का मैदान लिंक

3
Titian Cernicova-Dragomir 18 जुलाई 2018, 13:29
मेरे उदाहरण में ऐसा नहीं है मुझे कोई कंपाइलर त्रुटि नहीं मिलती है
 – 
Neil Stevens
18 जुलाई 2018, 13:27
तो कुछ और काम पर हो सकता है, इस तरह से व्यवहार करना चाहिए। आपके सटीक कोड के साथ एक खेल का मैदान लिंक जोड़ा गया और हमें एक त्रुटि मिलती है। हो सकता है कि आपका असली कोड किसी तरह से अलग हो? क्या पैरामीटर वैकल्पिक हैं?
 – 
Titian Cernicova-Dragomir
18 जुलाई 2018, 13:30
विस्तृत करने के लिए, उपरोक्त में (बनाम कोड में) यदि मैं एक तर्क पारित करता हूं तो मुझे दूसरे के लिए एक कंपाइलर त्रुटि मिलती है
 – 
Neil Stevens
18 जुलाई 2018, 13:30
यह अजीब लगता है। क्या आप सुनिश्चित हैं कि जिस वर्ग को आप सही वर्ग को तुरंत चालू कर रहे हैं? क्या आपका आयात ठीक है? आप किस कंपाइलर सेटिंग्स का उपयोग कर रहे हैं (हालांकि मैं वास्तव में एक के बारे में नहीं सोच सकता जो इस व्यवहार को प्रभावित करेगा)
 – 
Titian Cernicova-Dragomir
18 जुलाई 2018, 13:32
मैं प्रदान किए गए उत्तर के बारे में 100% निश्चित हूं। टाइपस्क्रिप्ट के हाल के संस्करणों में कम से कम यह व्यवहार है (मुझे संदेह है कि यह हमेशा रहा है लेकिन जांच करने की आवश्यकता होगी)
 – 
Titian Cernicova-Dragomir
18 जुलाई 2018, 13:34

new का उदाहरण बनाना FooImpl एक त्रुटि उत्पन्न करता है (जब कंस्ट्रक्टर को कोई आर्ग्स पास नहीं किया जाता है, क्योंकि कंस्ट्रक्टर विरासत में मिलता है) जिससे कंस्ट्रक्टर के उपयोग को args के साथ मजबूर किया जाता है:

const f = new FooImpl();
Expected 1 arguments, but got 0.
0
Ric 18 जुलाई 2018, 13:10
तब कुछ ठीक नहीं है, यह डिफ़ॉल्ट व्यवहार है।
 – 
Ric
18 जुलाई 2018, 13:41
मैंने अभी-अभी आपका कोड कॉपी किया है और कह सकता हूं कि अगर new AssessmentCenterDataSource(....) को कोई फ़ंक्शन पास नहीं किया जाता है तो मुझे एक त्रुटि मिलती है
 – 
Ric
18 जुलाई 2018, 13:52
1
अजीब, आईडीई को पुनरारंभ करने के बाद सब सही है, एसओ पर कूदने और मूर्ख की तरह दिखने से पहले आईडीई को पुनरारंभ करने के लिए एक मानसिक नोट बनाना चाहिए
 – 
Neil Stevens
18 जुलाई 2018, 13:59
जब कुछ भी समझ में नहीं आता है, तो कंप्यूटर रीबूटिंग क्रम में है :)
 – 
Ric
18 जुलाई 2018, 14:26