क्या विरासत के बिना कोई OO भाषाएँ हैं?


22

आज एक कोड की समीक्षा के दौरान, मेरे एक सहयोगी ने कुछ दिलचस्प कहा:

prototypeकेवल तब उपयोगी होता है जब आपको विरासत की आवश्यकता होती है - और जब विरासत एक अच्छा विचार है ?

मैंने इस बारे में सोचा था और मुझे एहसास हुआ कि मैं आमतौर पर विरासत का उपयोग करता हूं कोड के आसपास पाने के लिए जो पहली जगह में बुरी तरह से डिजाइन किया गया था। आधुनिक OO शैली विरासत पर रचना पसंद करती है, लेकिन मुझे ऐसी किसी भी भाषा की जानकारी नहीं है, जो इसे दिल से लगाती है और वास्तव में इसे लागू करती है।

क्या कक्षाओं, वस्तुओं, विधियों, इंटरफेस, और इसी तरह की कोई सामान्य-उद्देश्य वाली प्रोग्रामिंग भाषाएं हैं, जो वर्ग-आधारित विरासत को अस्वीकार करती हैं? (यदि इस तरह के विचार से कोई मतलब नहीं है, तो क्यों नहीं?)


7
आपके सहयोगी ने आपको भटका दिया है। prototypeआपको यह भी सार्वजनिक तरीकों और गुण है कि उदाहरणों के बीच साझा किया जाना चाहिए जब लिए उपयोगी है। यह भी उपयोगी है क्योंकि यह आप ठीक ढंग से उपयोग करने के लिए अनुमति देता है instanceofजावास्क्रिप्ट में ऑपरेटर: if (foo instanceof Foo) { ...
ग्रेग बरगार्ट

2
मुझे लगता है कि हमें प्रकार, स्थिति और व्यवहार की विरासत के बीच अंतर करना चाहिए। जावा समुदाय में रचना की प्राथमिकता बहुत आम है लेकिन एक ही समय में, प्रकार के उत्तराधिकार (और यहां तक ​​कि कई विरासत) का व्यापक रूप से उपयोग और प्रोत्साहित किया जाता है ... और implementsकीवर्ड और इंटरफेस का उपयोग करके महसूस किया गया (जैसा कि राज्य की विरासत के विपरीत है और extendsकिसी भी कार्यान्वयन वाले वर्गों पर कीवर्ड के उपयोग के साथ पेश किया गया व्यवहार )।
toniedzwiedz

6
रचना का उल्लेख करने का मतलब यह नहीं है कि विरासत को पूरी तरह से छोड़ देना एक अच्छा विचार है।
कालेब

5
जावा को कार्यान्वयन विरासत के बिना देखें : "Google का जाना एक ऐसी भाषा का उदाहरण है जो OOP होने के दौरान कार्यान्वयन विरासत के साथ दूर होती है ..."
gnat

1
@GregBurghardt एक फैक्ट्री फ़ंक्शन के साथ पूरा किया जा सकता है जो एक ऑब्जेक्ट देता है जिसमें फ़ंक्शंस होते हैं (क्लोजर में निजी डेटा संग्रहीत करना)। new, thisऔर prototypeसभी आम उपयोग के लिए एक बहुत अधिक हैं IMO।
बेंजामिन हॉजसन

जवाबों:


18

ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग की परिभाषा के प्रश्न को अलग करने से यह प्रश्न बन जाता है कि "क्या ऐसी भाषाएँ हैं जो केवल रचना का उपयोग करती हैं और विरासत में कोई उपकरण नहीं हैं?"

इसका उत्तर काफी सरलता से "हां" है। जाने में, वंशानुक्रम करने का कोई तरीका नहीं है क्योंकि एक वर्ग इसके बारे में सोचता है। एक वस्तु को दूसरी वस्तु में एम्बेड किया जा सकता है और उस वस्तु को विस्तारित किया जा सकता है। से वस्तु Desoriented भाषा ( GitHub दर्पण ):

type Person struct {
        Name string
}

func (p *Person) Intro() string {
        return p.Name
}

type Woman struct {
        Person
}

func (w *Woman) Intro() string {
        return "Mrs. " + w.Person.Intro()
}

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

इस पर अधिक GoLang ट्यूटोरियल्स में देखा जा सकता है : Inheritance और Go - या इसके निकटता में उपवर्ग

तो हाँ, वंशानुक्रम के बिना एक ओओ भाषा होना संभव है, और एक मौजूद है।

भीतर यह जाना जाता है एम्बेडिंग के रूप में जाना जाता है और संलग्न संरचनाओं को एम्बेडेड क्षेत्रों और कार्यों तक पहुंचने की क्षमता देता है जैसे कि यह उनके पास भी था - लेकिन यह एक उपवर्ग नहीं है। गो दर्शन में डिजाइन दर्शन पाया जा सकता है : कोई प्रकार विरासत में क्यों नहीं है?


एक भी के उपयोग के बारे में टिप्पणी कर सकता है typedefऔर structसी में ...
cwallenpoole

@ cwallenpoole वास्तव में वहां समान विचार हैं, हालांकि मैं सी को ऑब्जेक्ट ओरिएंटेड भाषा कहने में संकोच करूंगा।

मुझे नही पता। मैं इस तथ्य को स्वीकार करता हूं कि आप संलग्न कार्यों के साथ ऑब्जेक्ट नहीं बना सकते हैं, लेकिन इसके खिलाफ काम करता है, लेकिन विरासत के बिना, ओओपी अपने स्वाद का बहुत कुछ खो देता है।
cwallenpoole

@cwallenpoole और हम इस बात को परिभाषित करने में लगे हैं कि विरासत क्या है और वस्तु अभिविन्यास। लेकिन यह है अपने बस समस्या के बारे में सोच का एक अलग तरीका संभव,। बात यह है कि विरासत में सी + + और जावा प्रोग्रामर विस्तार के बारे में सोचते हैं ... लेकिन अन्य मॉडल हैं। विरासत के बिना विस्तार: 1 , 2 , 3 अच्छे हैं।

"ऑब्जेक्ट डिसऑर्डिनेटेड लैंग्वेज" का लिंक फिलहाल एक रीडायरेक्ट लूप में अटका हुआ है, लेकिन मुझे यह लेख यहां मिला: github.com/nu7hatch/areyoufuckingcoding.me/blob/master/content/ । धन्यवाद!
मैट ब्राउन

7

क्या कक्षाओं, वस्तुओं, विधियों, इंटरफेस, और इसी तरह की कोई सामान्य-उद्देश्य वाली प्रोग्रामिंग भाषाएं हैं, जो वर्ग-आधारित विरासत को अस्वीकार करती हैं?

यह VBA के एक विवरण की तरह बहुत अधिक पढ़ता है - विज़ुअल बेसिक फॉर एप्लिकेशन, माइक्रोसॉफ्ट ऑफिस और अन्य VBA- सक्षम होस्ट (जैसे ऑटोकैड, सेज 300 ईआरपी, आदि), या यहां तक ​​कि वीबी 6 में एम्बेडेड। "बेसिक" का "ए" वैसे भी "ऑल-उद्देश्य" के लिए खड़ा है, इसलिए "सामान्य-उद्देश्य" हिस्सा है।

VB6 / VBA में कक्षाएं (और इसलिए ऑब्जेक्ट्स), तरीके और इंटरफेस हैं - आप ISomethingइस तरह एक क्लास मॉड्यूल में एक इंटरफ़ेस को परिभाषित कर सकते हैं :

Option Explicit

Public Sub DoSomething()
End Sub

और फिर एक और वर्ग है जो ऐसा करता है:

Option Explicit
Implements ISomething

Private Sub ISomething_DoSomething()
    'implementation here
End Sub

ऐसा कोई वर्ग, जो सार्वजनिक सदस्यों को उजागर नहीं करता है, उसे कभी भी अपने ISomethingइंटरफेस के माध्यम से एक्सेस किया जा सकता है - और वहाँ बहुत अच्छी तरह से दर्जनों विभिन्न कार्यान्वयन ISomethingहो सकते हैं, इसलिए OOP VBA कोड बहुरूपता के लिए पूरी तरह से सक्षम है, और यह किसी दिए गए वर्ग के लिए पूरी तरह से कानूनी है। कई इंटरफेस को लागू करने के लिए भी।

VB6 / VBA वर्ग वंशानुक्रम की अनुमति नहीं देता है , लेकिन आप किसी अन्य प्रकार से कार्यान्वयन को विरासत में नहीं दे सकते हैं , केवल इसका इंटरफ़ेस। अब, क्या यह एक दुर्घटना है, एक डिजाइन दोष, प्रतिभा का एक स्ट्रोक या बहस के लिए एक बड़ा बदसूरत निरीक्षण है; यह स्पष्ट नहीं है कि VB6 / VBA इसे दिल तक ले जाता है , लेकिन यह निश्चित रूप से इसे लागू करता है।

यदि गो क्लास इनहेरिटेंस नहीं करता है और फिर भी एक ओओपी भाषा है , तो मैं यह नहीं देखता कि वीबी 6 / वीबीए को ओओपी भाषा क्यों नहीं माना जा सकता।</PreemptiveResponseToVBAHatersThatWillSayItIsNotAnOOPLanguage>


1
निष्पक्ष होने के लिए, ओपी ने आधुनिक भाषाओं के बारे में पूछा । =;) -
रबरडक

@ रबरडाक # नाराज़!
मैथ्यू गुइंडन

0

आप कंपाइलर को निजी / संरक्षित, और "PImpl", या "निजी कार्यान्वयन" तकनीकों के आधुनिक उपयोग के माध्यम से चयनात्मक विरासत को लागू कर सकते हैं।

कई एपीआई केवल उन घटकों को उजागर करते हैं जो आप एक उपयोगकर्ता को विरासत में प्राप्त करना चाहते हैं, और बाकी को एक अलग कार्यान्वयन वर्ग में छिपाते हैं। इसलिए आप उन वर्गों को लिख सकते हैं जिनके सार्वजनिक इंटरफेस वास्तव में, निर्जन हैं, केवल वस्तु रचना के माध्यम से उपयोग करने योग्य हैं, और संकलक-लागू हैं। यह अक्सर अच्छा अभ्यास होता है, जब यह सॉफ़्टवेयर के इरादे को लागू करने के लिए संकलक का उपयोग करता है।

जावास्क्रिप्ट शो में निजी सदस्य कार्यों के लिए एक त्वरित खोज एक समान सिद्धांत है, हालांकि कोई भी आपके कोड को देख सकता है यदि वे इसका उपयोग कर सकते हैं: http://www.crockford.com/javascript/pStreet.html

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.