नेपाली नेपालीDOCS
GitHub

क्लास (वस्तु-उन्मुख प्रोग्रामिङ)

वस्तु-उन्मुख प्रोग्रामिङ (OOP) ले डाटा र त्यो डाटासँग सम्बन्धित कार्यहरूलाई वस्तु (object) भनिने एकाइमा जोड्छ। तपाईंले वास्तविक संसारका कुराहरू — मान्छे, पुस्तक, बैंक खाता — जसरी प्रोग्राम गर्न सक्नुहुन्छ।

१. OOP के हो?

सोच्नुहोस्, तपाईंको प्रोग्राममा एउटा बैंक खाता चलाउनु पर्छ भने। बैंक खातामा हुन्छ: सङ्ख्या, नाम, सन्तुलन (डाटा)। र यससँग गर्न सकिने काम: पैसा जम्मा गर्ने, निकाल्ने, सन्तुलन हेर्ने (व्यवहार)।

OOP मा हामी डाटा र व्यवहारलाई एउटै वस्तु मा जोड्छौं — छुट्टै-छुट्टै भ्यारिएबल र कार्यहरूमा राखेर "जोड्नै बिर्सने" वा गल्ती गर्ने अवसर हुँदैन।

डाटा → फिल्ड
वस्तुको अवस्था: खाता_सङ्ख्या, नाम, सन्तुलन
व्यवहार → मेथड
वस्तुको काम: जम्मा(), निकाल(), जाँच()

२. क्लास र वस्तु

क्लास भनेको नक्सा/ब्लूप्रिन्ट हो; वस्तु भनेको त्यही नक्साबाट बनेको वास्तविक चीज। एउटै क्लासबाट कति पनि वस्तु बनाउन सकिन्छ, हरेकको आफ्नै डाटा हुन्छ।

क्लास प्रकार कीवर्डले घोषणा हुन्छ र अन्त्य ले समाप्त:

प्रकार मानिस
    पाठ नाम
    पूर्णाङ्क उमेर
अन्त्य

वस्तु नयाँ ले बनाइन्छ:

राख राम = नयाँ मानिस
राख सीता = नयाँ मानिस   # एउटै क्लास, फरक-फरक वस्तु
सादृश्य: क्लास "घरको नक्सा" जस्तो हो, वस्तु "त्यही नक्साबाट बनेको साँचो घर" जस्तो। नक्सा एउटै, घर अनगिन्ती।

३. फिल्डहरू (गुण/अवस्था)

फिल्ड भनेको वस्तुभित्रको चर हो — क्लासको सुरुमा प्रकारसहित घोषणा गरिन्छ। हरेक वस्तुको आफ्नै फिल्ड मान हुन्छ:

प्रकार मानिस
    पाठ नाम
    पूर्णाङ्क उमेर
अन्त्य

राख राम = नयाँ मानिस
राम.नाम = "राम"       # फिल्डमा मान राख्ने
राम.उमेर = २५
लेख राम.नाम           # राम
लेख राम.उमेर          # २५

फिल्डमा सीधै पढ्न र लेख्न सकिन्छ:

राख सीता = नयाँ मानिस
सीता.नाम = "सीता"
सीता.उमेर = २२

राम.उमेर = २६          # रामको मात्र परिवर्तन
लेख राम.उमेर           # २६ — सीता अपरिवर्तित

४. कन्स्ट्रक्टर (निर्माण)

वस्तु बनाउनेबित्तिकै फिल्डहरू सुरु गर्न निर्माण(...) कन्स्ट्रक्टर प्रयोग गरिन्छ — नयाँ ले बनाउँदा स्वचालित रूपमा चल्छ:

प्रकार मानिस
    पाठ नाम
    पूर्णाङ्क उमेर

    निर्माण(पाठ नाम, पूर्णाङ्क उमेर)
        यो.नाम = नाम
        यो.उमेर = उमेर
    अन्त्य
अन्त्य

राख राम = नयाँ मानिस("राम", २५)   # निर्माण स्वचालित
लेख राम.नाम                        # राम
सुझाव: कन्स्ट्रक्टर प्रयोग गर्दा "अधुरो वस्तु" (फिल्ड भर्नै बिर्सिएको) हुँदैन — वस्तु बन्नासाथ सबै जरुरी मान पाइसकेको हुन्छ।

कन्स्ट्रक्टरमा सीधै प्रशोधन पनि गर्न सकिन्छ:

प्रकार खाता
    पाठ नाम
    दशमलव सन्तुलन

    निर्माण(पाठ नाम, दशमलव प्रारम्भिक)
        यो.नाम = नाम
        यो.सन्तुलन = प्रारम्भिक
        लेख "खाता खुल्यो: " + नाम
    अन्त्य
अन्त्य

राख ख = नयाँ खाता("राम", १०००.०)
# आउटपुट: खाता खुल्यो: राम

५. मेथडहरू (व्यवहार)

मेथड भनेको क्लासभित्रको कार्य हो — वस्तुको डाटासँग काम गर्छ। फिल्डमा यो. ले पहुँच गरिन्छ:

प्रकार मानिस
    पाठ नाम
    पूर्णाङ्क उमेर

    निर्माण(पाठ नाम, पूर्णाङ्क उमेर)
        यो.नाम = नाम
        यो.उमेर = उमेर
    अन्त्य

    कार्य परिचय()
        लेख "मेरो नाम " + यो.नाम + " हो र म " + यो.उमेर + " वर्षको हुँ"
    अन्त्य

    कार्य जन्मदिन() -> पूर्णाङ्क
        यो.उमेर = यो.उमेर + १
        फर्काऊ यो.उमेर
    अन्त्य
अन्त्य

राख राम = नयाँ मानिस("राम", २५)
राम.परिचय()              # मेरो नाम राम हो र म २५ वर्षको हुँ
लेख राम.जन्मदिन()          # २६

मेथडले फिल्ड बदल्न सक्छ (माथिको जन्मदिन), गणना गर्न सक्छ, र अन्य मेथड कल गर्न सक्छ। मेथडको सन्दर्भ यो. बिना पनि चल्छ, तर स्पष्टताका लागि यो. प्रयोग गर्नुहोस्।

६. यो (this)

यो ले वर्तमान वस्तु जनाउँछ। प्यारामिटर र फिल्डको नाम उस्तै भएको बेला फरक गर्न अपरिहार्य हुन्छ:

निर्माण(पाठ नाम, पूर्णाङ्क उमेर)
    यो.नाम = नाम        # यो.नाम = फिल्ड; नाम = प्यारामिटर
    यो.उमेर = उमेर
अन्त्य

यो. ले अर्को मेथदमा पनि पहुँच गर्न सकिन्छ:

कार्य संक्षिप्त() -> पाठ
    फर्काऊ यो.नाम + " (" + यो.उमेर + ")"
अन्त्य

७. साझा कार्य (static मेथड)

सबै मेथडहरू वस्तुसँग चल्ने हुँदैनन् — केही काम वस्तु बनाउनु नपर्ने हुन्छ। साझा कार्य ले क्लासबाटै कल गर्न सकिने मेथड बनाउँछ, उदाहरण/वस्तु चाहिँदैन:

प्रकार उपकरण
    साझा कार्य क्षेत्रफल(अर्धव्यास)
        फर्काऊ ३.१४१५९ * अर्धव्यास * अर्धव्यास
    अन्त्य

    साझा कार्य मद्दत()
        लेख "अर्धव्यास दिनुहोस् र क्षेत्रफल पाउनुहोस्"
    अन्त्य
अन्त्य

उपकरण.मद्दत()                     # क्लासबाटै कल
लेख उपकरण.क्षेत्रफल(२)            # १२.५६६३६
महत्त्वपूर्ण: साझा कार्य मा यो. प्रयोग गर्न मिल्दैन — किनभने त्यहाँ कुनै वस्तु छैन। यस्ता मेथडहरू सामान्य उपयोगी कार्य (helper) का लागि हो।

८. पहुँच नियन्त्रण (Encapsulation)

पहुँच नियन्त्रणले कसले के देख्न/फेर्न पाउँछ नियन्त्रण गर्छ। यसलाई encapsulation पनि भनिन्छ — वस्तुको भित्री डाटा लुकाएर मेथडबाट मात्र फेर्न दिने। नेपालीमा चार मोडिफायर छन्:

मोडिफायरEnglishपहुँच
सार्वजनिकpublicजतासुकैबाट
निजीprivateक्लासभित्र मात्र
सुरक्षितprotectedक्लासभित्र र उत्तराधिकारीहरूमा
आन्तरिकinternalक्लासभित्र र सोही मोड्युलभित्र

उदाहरण — डाटालाई निजी राखेर नियन्त्रित मेथडबाट मात्र फेर्ने:

प्रकार खाता
    निजी दशमलव सन्तुलन

    निर्माण(दशमलव प्रारम्भिक)
        यो.सन्तुलन = प्रारम्भिक
    अन्त्य

    कार्य जम्मा(दशमलव रकम)
        यो.सन्तुलन = यो.सन्तुलन + रकम
    अन्त्य

    कार्य जाँच() -> दशमलव
        फर्काऊ यो.सन्तुलन
    अन्त्य
अन्त्य

राख ख = नयाँ खाता(१०००.०)
ख.जम्मा(५००.०)
लेख ख.जाँच()          # १५००.०
# ख.सन्तुलन = ०       # त्रुटि — निजी फिल्ड बाहिरबाट फेर्न मिल्दैन
किन लुकाउने? सन्तुलनमा कुनै नियम (जस्तै: ऋण नजाने) थप्नुपरे मेथडमा मात्र थप्नुहोस् — प्रोग्रामका सबै ठाउँ खोज्नु पर्दैन। फिल्ड सिधा फेर्न पाए नियम भाँचिन सक्छ।

मोडिफायर नलेखेको फिल्ड/मेथड — डिफल्ट रूपमा सार्वजनिक जस्तै व्यवहार हुन्छ। सार्वजनिक लेख्नु स्पष्टता बढाउने तरिका हो।

९. इनहेरिटेन्स र कम्पोजिसन

इनहेरिटेन्स (उत्तराधिकार) — अर्को क्लासका गुण लिने। पार्सरले प्रकार बाल : आमा रूप स्वीकार गर्छ, तर उत्तराधिकार हाल लागू भइसकेको छैन:

जानकारी: प्रकार बाल : आमा पार्सरले पार्स गर्छ तर हाल आमा क्लासका गुणहरू बालमा आउँदैनन्। इनहेरिटेन्स योजना (planned) हो।

त्यसबेलासम्म कम्पोजिसन प्रयोग गर्नुहोस् — अर्को क्लासको वस्तुलाई फिल्डको रूपमा राख्ने। प्रायः कम्पोजिसन उत्तिकै शक्तिशाली र सरल हुन्छ:

प्रकार ठेगाना
    पाठ शहर
    पाठ जिल्ला

    निर्माण(पाठ शहर, पाठ जिल्ला)
        यो.शहर = शहर
        यो.जिल्ला = जिल्ला
    अन्त्य
अन्त्य

प्रकार मानिस
    पाठ नाम
    ठेगाना वास    # कम्पोजिसन — अर्को क्लासको वस्तु

    निर्माण(पाठ नाम, पाठ शहर, पाठ जिल्ला)
        यो.नाम = नाम
        यो.वास = नयाँ ठेगाना(शहर, जिल्ला)
    अन्त्य

    कार्य ठेगाना_लेख()
        लेख यो.नाम + " बस्छ: " + यो.वास.शहर + ", " + यो.वास.जिल्ला
    अन्त्य
अन्त्य

राख राम = नयाँ मानिस("राम", "काठमाडौं", "काठमाडौं")
राम.ठेगाना_लेख()   # राम बस्छ: काठमाडौं, काठमाडौं

१०. OOP का चार सिद्धान्त

OOP चार मुख्य सिद्धान्तमा उभिएको छ। नेपालीमा अहिलेसम्मको समर्थन यसप्रकार छ:

Encapsulation
डाटा + व्यवहार एउटै क्लासमा; निजी जस्ता मोडिफायरले पहुँच नियन्त्रण। ✅ समर्थित
Inheritance
क्लासले अर्को क्लासका गुण लिने। ⏳ पार्स गरिएको तर लागू हुन बाँकी — अहिले कम्पोजिसन प्रयोग गर्नुहोस्।
Polymorphism
एउटै मेथड/अपरेटर फरक फरक सन्दर्भमा फरक व्यवहार (जस्तै + सङ्ख्या र पाठ दुवैमा)। आंशिक रूपमा भाषाले नै ह्यान्डल गर्छ।
Abstraction
जटिल विवरण लुकाएर सरल इन्टरफेस — राम्रो मेथड नाम, साझा कार्य, मानक पुस्तकालय। ✅ अभ्यासद्वारा समर्थित

अहिले नेपालीमा encapsulation पूर्ण रूपमा प्रयोग गर्न सकिन्छ; inheritance आउँदा संस्करणका लागि योजनामा छ। त्यसबेलासम्म कम्पोजिसनले धेरै उद्देश्य पूरा गर्छ।

११. पूरा उदाहरण

यहाँ OOP का धेरै तत्व एकै ठाउँमा — क्लास, कन्स्ट्रक्टर, मेथड, यो, साझा कार्य, कम्पोजिसन र सूचीको लुप:

प्रकार पुस्तक
    पाठ शीर्षक
    पाठ लेखक
    दशमलव मूल्य

    निर्माण(पाठ शीर्षक, पाठ लेखक, दशमलव मूल्य)
        यो.शीर्षक = शीर्षक
        यो.लेखक = लेखक
        यो.मूल्य = मूल्य
    अन्त्य

    कार्य जानकारी() -> पाठ
        फर्काऊ "«" + यो.शीर्षक + "» — " + यो.लेखक
    अन्त्य
अन्त्य

प्रकार पसल
    पाठ नाम
    सूची पुस्तकहरू

    निर्माण(पाठ नाम)
        यो.नाम = नाम
        यो.पुस्तकहरू = []
    अन्त्य

    कार्य जानकारी()
        लेख "पसल: " + यो.नाम + " (" + सूची_लम्बाइ(यो.पुस्तकहरू) + " पुस्तक)"
    अन्त्य

    साझा कार्य छुट_मूल्य(दशमलव मूल्य, दशमलव प्रतिशत) -> दशमलव
        फर्काऊ मूल्य * (१ - प्रतिशत / १००)
    अन्त्य
अन्त्य

राख किताब = नयाँ पुस्तक("नेपाली कथा", "आशा", ३००.०)
लेख किताब.जानकारी()
लेख "छुट पछि: " + सङ्ख्या_पाठ(पसल.छुट_मूल्य(किताब.मूल्य, २०.०))

सूचीमा मान थप्ने नेटिभ (सूची_थप) अहिले योजनामा छ — हाल सूची सुरुमै मानसहित बनाउन सकिन्छ:

राख पुस्तकहरू = [
    नयाँ पुस्तक("नेपाली कथा", "आशा", ३००.०),
    नयाँ पुस्तक("गणित", "रमेश", २५०.०)
]

प्रत्येक क भित्र पुस्तकहरू
    लेख क.जानकारी()
अन्त्य