कोटलिन वंशानुक्रम (उदाहरण के साथ)

इस लेख में, आप विरासत के बारे में जानेंगे। विशेष रूप से, कोटलिन में क्या है और इसे कैसे लागू किया जाए (उदाहरणों की मदद से)।

विरासत वस्तु उन्मुख प्रोग्रामिंग की प्रमुख विशेषताओं में से एक है। यह उपयोगकर्ता को एक मौजूदा वर्ग (बेस क्लास) से एक नया वर्ग (व्युत्पन्न वर्ग) बनाने की अनुमति देता है।

व्युत्पन्न वर्ग बेस क्लास से सभी विशेषताओं को प्राप्त करता है और इसकी अपनी अतिरिक्त विशेषताएं हो सकती हैं।

कोटलिन विरासत के बारे में विवरण में जाने से पहले, हम आपको इन दो लेखों की जांच करने की सलाह देते हैं:

  • कोटलिन क्लास और ऑब्जेक्ट्स
  • कोटलिन प्राथमिक कंस्ट्रक्टर

वंशानुक्रम क्यों?

मान लीजिए, आपके आवेदन में, आप तीन अक्षर चाहते हैं - एक गणित शिक्षक , एक फुटबॉलर और एक व्यापारी

चूंकि, सभी पात्र व्यक्ति हैं, वे चल सकते हैं और बात कर सकते हैं। हालांकि, उनके पास कुछ विशेष कौशल भी हैं। एक गणित शिक्षक गणित पढ़ा सकता है , एक फुटबॉलर फुटबॉल खेल सकता है और एक व्यापारी एक व्यवसाय चला सकता है ।

आप व्यक्तिगत रूप से तीन कक्षाएं बना सकते हैं जो चल सकते हैं, बात कर सकते हैं और अपने विशेष कौशल का प्रदर्शन कर सकते हैं।

प्रत्येक कक्षा में, आप प्रत्येक वर्ण के लिए चलने और बात करने के लिए एक ही कोड कॉपी कर रहे होंगे।

यदि आप एक नई सुविधा जोड़ना चाहते हैं - खाएं, तो आपको प्रत्येक वर्ण के लिए समान कोड लागू करना होगा। यह आसानी से त्रुटि प्रवण हो सकता है (जब नकल कर रहा हो) और डुप्लिकेट कोड।

यह बहुत आसान होगा अगर हमारे पास Personबुनियादी विशेषताओं के साथ एक वर्ग होता है जैसे कि बात, चलना, खाना, सोना, और हमारे पात्रों के अनुसार उन विशेषताओं में विशेष कौशल जोड़ना। यह वंशानुक्रम का उपयोग करके किया जाता है।

विरासत का उपयोग करना, अब आप के लिए एक ही कोड लागू नहीं करते walk(), talk()और eat()प्रत्येक वर्ग के लिए। आपको बस उन्हें विरासत में हासिल करने की जरूरत है ।

तो, MathTeacher(व्युत्पन्न वर्ग) के लिए, आप एक Person(आधार वर्ग) की सभी विशेषताओं को प्राप्त करते हैं और एक नई सुविधा जोड़ते हैं teachMath()। इसी तरह, Footballerवर्ग के लिए, आप वर्ग की सभी विशेषताओं को विरासत में लेते हैं Personऔर एक नई सुविधा playFootball()आदि जोड़ते हैं ।

यह आपके कोड को क्लीनर, समझने योग्य और विस्तार योग्य बनाता है।

यह याद रखना महत्वपूर्ण है: जब विरासत के साथ काम करते हैं, तो प्रत्येक व्युत्पन्न वर्ग को इस शर्त को संतुष्ट करना चाहिए कि क्या यह " आधार वर्ग " है या नहीं। ऊपर के उदाहरण में, MathTeacher a है Person , Footballer a है Person । आपके पास ऐसा कुछ नहीं हो सकता, Businessman एक है Business

कोटलिन वंशानुक्रम

आइए उपरोक्त चर्चा को कोड में लागू करने का प्रयास करें:

 ओपन क्लास पर्सन (उम्र: इंट) (खाने के लिए कोड, बात करना, चलना) क्लास मैथ टीचर (उम्र: इंट): पर्सन (उम्र) (// मैथ टीचर के अन्य फीचर्स) क्लास फुटबॉलर (उम्र: इंट): पर्सन ( आयु) (// फुटबॉलर की अन्य विशेषताएं) वर्ग व्यवसायी (आयु: इंट): व्यक्ति (उम्र) (// व्यवसायी की अन्य विशेषताएं)

इधर, Personएक आधार वर्ग है, और वर्गों MathTeacher, Footballerऔर Businessmanव्यक्ति वर्ग से हुआ है।

ध्यान दें, openबेस क्लास से पहले कीवर्ड Person। यह महत्वपूर्ण है।

डिफ़ॉल्ट रूप से, कोटलिन में कक्षाएं अंतिम हैं। यदि आप जावा से परिचित हैं, तो आप जानते हैं कि एक अंतिम वर्ग को उपवर्गित नहीं किया जा सकता है। एक वर्ग पर खुले एनोटेशन का उपयोग करके, कंपाइलर आपको नई कक्षाओं को प्राप्त करने की अनुमति देता है।

उदाहरण: कोटलिन वंशानुक्रम

 open class Person(age: Int, name: String) ( init ( println("My name is $name.") println("My age is $age") ) ) class MathTeacher(age: Int, name: String): Person(age, name) ( fun teachMaths() ( println("I teach in primary school.") ) ) class Footballer(age: Int, name: String): Person(age, name) ( fun playFootball() ( println("I play for LA Galaxy.") ) ) fun main(args: Array) ( val t1 = MathTeacher(25, "Jack") t1.teachMaths() println() val f1 = Footballer(29, "Christiano") f1.playFootball() )

जब आप प्रोग्राम चलाते हैं, तो आउटपुट होगा:

मेरा नाम जैक है। मेरी उम्र 25 है मैं प्राइमरी स्कूल में पढ़ाता हूँ। मेरा नाम क्रिस्टियानो है। मेरी उम्र 29 है मैं ला गैलेक्सी के लिए खेलता हूं।

यहां, दो कक्षाएं MathTeacherऔर वर्ग Footballerसे ली गई हैं Person

Personवर्ग के प्राथमिक निर्माता ने दो गुणों की घोषणा की: आयु और नाम, और इसमें एक इनिशलाइज़र ब्लॉक है। बेस क्लास के initilizer ब्लॉक (और सदस्य फ़ंक्शन) Personको व्युत्पन्न वर्गों ( MathTeacherऔर Footballer) की वस्तुओं द्वारा एक्सेस किया जा सकता है ।

व्युत्पन्न वर्ग MathTeacherऔर Footballerअपने स्वयं के सदस्य कार्य होते हैं teachMaths()और playFootball()क्रमशः। ये कार्य केवल उनके संबंधित वर्ग की वस्तुओं से ही सुलभ हैं।

जब MathTeacherक्लास का ऑब्जेक्ट t1 बनाया जाता है,

 वैल टी 1 = मैथ टीचर (25, "जैक")

पैरामीटर प्राथमिक निर्माता को दिए जाते हैं। कोटलिन में, initब्लॉक तब कहा जाता है जब ऑब्जेक्ट बनाया जाता है। चूंकि, वर्ग MathTeacherसे व्युत्पन्न है Person, यह बेस क्लास (व्यक्ति) में इनिशियलाइज़र ब्लॉक की तलाश करता है और इसे निष्पादित करता है। यदि MathTeacherinit ब्लॉक होता, तो संकलक भी व्युत्पन्न वर्ग के init ब्लॉक को निष्पादित करता।

अगला, teachMaths()ऑब्जेक्ट के लिए फ़ंक्शन को स्टेटमेंट t1का उपयोग करके कहा जाता है t1.teachMaths()

कार्यक्रम इसी तरह काम करता है जब वस्तु f1की Footballerश्रेणी का निर्माण कर रहा है। यह बेस क्लास के इनिट ब्लॉक को निष्पादित करता है। फिर, कथन का उपयोग करके कक्षा की playFootball()विधि Footballerको कहा जाता है f1.playFootball()

महत्वपूर्ण नोट्स: कोटलिन वंशानुक्रम

  • यदि क्लास में प्राथमिक कंस्ट्रक्टर है, तो प्राथमिक कंस्ट्रक्टर के मापदंडों का उपयोग करके आधार को आरंभीकृत किया जाना चाहिए। उपरोक्त कार्यक्रम में, दोनों व्युत्पन्न वर्गों के दो पैरामीटर हैं ageऔर name, इन दोनों मापदंडों को आधार वर्ग में प्राथमिक निर्माता में आरंभीकृत किया गया है।
    यहाँ एक और उदाहरण है:
     open class Person(age: Int, name: String) ( // some code ) class Footballer(age: Int, name: String, club: String): Person(age, name) ( init ( println("Football player $name of age $age and plays for $club.") ) fun playFootball() ( println("I am playing football.") ) ) fun main(args: Array) ( val f1 = Footballer(29, "Cristiano", "LA Galaxy") )  
    यहां व्युत्पन्न वर्ग के प्राथमिक निर्माता में 3 पैरामीटर हैं, और आधार वर्ग में 2 पैरामीटर हैं। ध्यान दें कि, बेस क्लास के दोनों मापदंडों को इनिशियलाइज़ किया गया है।
  • प्राथमिक कंस्ट्रक्टर न होने की स्थिति में, प्रत्येक बेस क्लास को आधार (सुपर कीवर्ड का उपयोग करके) को इनिशियलाइज़ करना होगा या किसी अन्य कंस्ट्रक्टर को सौंपना होगा। उदाहरण के लिए,
     fun main(args: Array) ( val p1 = AuthLog("Bad Password") ) open class Log ( var data: String = "" var numberOfData = 0 constructor(_data: String) ( ) constructor(_data: String, _numberOfData: Int) ( data = _data numberOfData = _numberOfData println("$data: $numberOfData times") ) ) class AuthLog: Log ( constructor(_data: String): this("From AuthLog -> + $_data", 10) ( ) constructor(_data: String, _numberOfData: Int): super(_data, _numberOfData) ( ) )
    यह प्रोग्राम कैसे काम करता है, इसके बारे में अधिक जानने के लिए, कोटलिन सेकेंडरी कंस्ट्रक्टर पर जाएँ।

ओवरराइडिंग मेंबर फंक्शंस और प्रॉपर्टीज

यदि बेस क्लास और व्युत्पन्न वर्ग में एक ही नाम के साथ एक सदस्य फ़ंक्शन (या संपत्ति) होता है, तो आपको overrideकीवर्ड का उपयोग करके व्युत्पन्न वर्ग के सदस्य फ़ंक्शन को ओवरराइड करने की आवश्यकता हो सकती है , और openबेस क्लास के सदस्य फ़ंक्शन के लिए कीवर्ड का उपयोग कर सकते हैं।

उदाहरण: ओवरराइडिंग मेंबर फंक्शन

 // Empty primary constructor open class Person() ( open fun displayAge(age: Int) ( println("My age is $age.") ) ) class Girl: Person() ( override fun displayAge(age: Int) ( println("My fake age is $(age - 5).") ) ) fun main(args: Array) ( val girl = Girl() girl.displayAge(31) )

जब आप प्रोग्राम चलाते हैं, तो आउटपुट होगा:

 मेरी नकली उम्र 26 है।

यहाँ, व्युत्पन्न वर्ग girl.displayAge(31)की displayAge()विधि को कहते हैं Girl

आप बेस क्लास की संपत्ति को इसी तरह से ओवरराइड कर सकते हैं।

नीचे दिए गए उदाहरण की जाँच करने से पहले कोटलिन में कोटलिन गेटर्स कैसे मिलते हैं और कैसे काम करते हैं, इस पर जाएँ।

 // Empty primary constructor open class Person() ( open var age: Int = 0 get() = field set(value) ( field = value ) ) class Girl: Person() ( override var age: Int = 0 get() = field set(value) ( field = value - 5 ) ) fun main(args: Array) ( val girl = Girl() girl.age = 31 println("My fake age is $(girl.age).") )

जब आप प्रोग्राम चलाते हैं, तो आउटपुट होगा:

 मेरी नकली उम्र 26 है।

आप देख सकते हैं, हम इस्तेमाल किया है overrideऔर openव्युत्पन्न वर्ग और आधार वर्ग में क्रमशः आयु संपत्ति के लिए कीवर्ड।

बेस क्लास के सदस्यों को व्युत्पन्न वर्ग से कॉल करना

आप superकीवर्ड का उपयोग करके एक व्युत्पन्न वर्ग से आधार वर्ग के कार्यों (और एक्सेस गुणों) को कॉल कर सकते हैं। ऐसे:

 open class Person() ( open fun displayAge(age: Int) ( println("My actual age is $age.") ) ) class Girl: Person() ( override fun displayAge(age: Int) ( // calling function of base class super.displayAge(age) println("My fake age is $(age - 5).") ) ) fun main(args: Array) ( val girl = Girl() girl.displayAge(31) )

जब आप प्रोग्राम चलाते हैं, तो आउटपुट होगा:

 मेरी उम्र 31 है। मेरी नकली उम्र 26 है।

दिलचस्प लेख...