यदि C ++ और Java प्रकार की पदानुक्रमों और प्रकारों के वर्गीकरण के बारे में हैं, तो गो रचना के बारे में है।
यदि C ++ और Java प्रकार की पदानुक्रमों और प्रकारों के वर्गीकरण के बारे में हैं, तो गो रचना के बारे में है।
जवाबों:
उसका अर्थ है कि आप कहां के आदेश पर कुछ का उपयोग करेंगे:
class A : public B {};
जावा या C ++ जैसी किसी चीज़ में, आप जिस चीज़ का उपयोग करेंगे (उसके समतुल्य):
class A {
B b;
};
हां, यह विरासत जैसी क्षमताएं प्रदान करता है। आइए उदाहरण का विस्तार थोड़ा ऊपर करें:
struct B {
int foo() {}
};
struct A {
B b;
};
A a;
a.foo(); // not allowed in C++ or Java, but allowed in Go.
हालांकि, ऐसा करने के लिए, आप C ++ या जावा में एक सिंटैक्स का उपयोग नहीं करते हैं - आप अपने स्वयं के नाम के बिना एम्बेडेड ऑब्जेक्ट को छोड़ देते हैं, इसलिए यह अधिक पसंद है:
struct A {
B;
};
यह सवाल / समस्या के लिए इसी तरह की तरह है यह एक ।
गो में, आपके पास वास्तव में OOP नहीं है।
यदि आप किसी वस्तु को "विशेषज्ञ" करना चाहते हैं, तो आप इसे एम्बेड करके करते हैं, जो एक रचना है, लेकिन कुछ अच्छाइयों के साथ यह आंशिक रूप से विरासत के समान है। आप इसे इस तरह करते हैं:
type ConnexionMysql struct {
*sql.DB
}
इस नमूने में, ConnexionMysql * sql.DB का एक प्रकार का विशेषज्ञता है, और आप ConnexionMysql पर * sql.DB पर परिभाषित कार्यों को कॉल कर सकते हैं:
type BaseMysql struct {
user string
password string
database string
}
func (store *BaseMysql) DB() (ConnexionMysql, error) {
db, err := sql.Open("mymysql", store.database+"/"+store.user+"/"+store.password)
return ConnexionMysql{db}, err
}
func (con ConnexionMysql) EtatBraldun(idBraldun uint) (*EtatBraldun, error) {
row := con.QueryRow("select pv, pvmax, pa, tour, dla, faim from compte where id=?", idBraldun)
// stuff
return nil, err
}
// somewhere else:
con, err := ms.bd.DB()
defer con.Close()
// ...
somethings, err = con.EtatBraldun(id)
तो पहली नजर में आप सोच सकते हैं कि यह रचना आपकी सामान्य करदेयता बनाने का उपकरण है।
परंतु
यदि कोई कार्य * sql.DB पर परिभाषित एक फ़ंक्शन * sql.DB पर परिभाषित अन्य फ़ंक्शन को कॉल करता है, तो यह मौजूद होने पर भी ConnexionMysql पर पुनर्निर्धारित फ़ंक्शन को कॉल नहीं करेगा।
शास्त्रीय विरासत के साथ, आप अक्सर ऐसा कुछ करते हैं:
func (db *sql.DB) doComplexThing() {
db.doSimpleThing()
db.doAnotherSimpleThing()
}
func (db *sql.DB) doSimpleThing() {
// standard implementation, that we expect to override
}
यही है, आप doComplexThing
सुपर क्लास को एक संगठन के रूप में विशेषज्ञता के कॉल पर परिभाषित करते हैं।
लेकिन Go में, यह विशेष फ़ंक्शन को नहीं बल्कि "सुपरक्लास" फ़ंक्शन कहेगा।
इसलिए, यदि आप एक एल्गोरिथ्म को * sql.DB पर परिभाषित कुछ फ़ंक्शन को कॉल करने की आवश्यकता चाहते हैं, लेकिन ConnexionMySQL (या अन्य विशेषज्ञता) पर फिर से परिभाषित किया गया है, तो आप इस एल्गोरिथ्म को * sql.DB के फ़ंक्शन के रूप में परिभाषित नहीं कर सकते, लेकिन इसे कहीं और परिभाषित कर सकते हैं। और यह फ़ंक्शन केवल प्रदान किए गए विशेषज्ञता के लिए कॉल की रचना करेगा।
आप इंटरफेस का उपयोग करके इसे इस तरह कर सकते हैं:
type interface SimpleThingDoer {
doSimpleThing()
doAnotherSimpleThing()
}
func doComplexThing(db SimpleThingDoer) {
db.doSimpleThing()
db.doAnotherSimpleThing()
}
func (db *sql.DB) doSimpleThing() {
// standard implementation, that we expect to override
}
func (db ConnexionMySQL) doSimpleThing() {
// other implemenation
}
यह वर्ग पदानुक्रम के शास्त्रीय अधिभाव से काफी अलग है।
विशेष रूप से, आप स्पष्ट रूप से दूसरे से एक समारोह कार्यान्वयन विरासत में सीधे तीसरे स्तर का नहीं हो सकता है।
व्यवहार में, आप ज्यादातर (ऑर्थोगोनल) इंटरफेस का उपयोग करते हुए समाप्त हो जाएंगे और फ़ंक्शन को उन कॉल को व्यवस्थित करने के कार्यान्वयन के "सुपरक्लास" होने के बजाय कॉल प्रदान करते हैं।
मेरे अनुभव में, यह पदानुक्रमों की व्यावहारिक अनुपस्थिति को एक स्तर से अधिक गहरा करता है।
बहुत बार, अन्य भाषाओं में, आपके पास रिफ्लेक्स होता है, जब आप देखते हैं कि अवधारणा ए अवधारणा बी का एक विशेषीकरण है, तो इस तथ्य को एक वर्ग बी और एक वर्ग ए को बी के उपवर्ग के रूप में बनाकर इसे संशोधित करने के बजाय। अपने डेटा के आसपास का कार्यक्रम, आप अपने कोड में वस्तुओं की वर्गीकरण को पुन: प्रस्तुत करने में समय बिताते हैं, इस सिद्धांत पर कि यह वास्तविकता है।
गो में आप एक सामान्य एल्गोरिथ्म को परिभाषित नहीं कर सकते और इसे विशेषज्ञ नहीं बना सकते। आपको एक सामान्य एल्गोरिथ्म को परिभाषित करना चाहिए और यह सुनिश्चित करना चाहिए कि यह सामान्य है और प्रदान किए गए इंटरफ़ेस कार्यान्वयन के साथ काम करता है।
कुछ पदानुक्रम के पेड़ों की बढ़ती जटिलता से भयभीत होकर, जिस पर कोडर एक एल्गोरिथ्म को समायोजित करने की कोशिश करने के लिए जटिल हैक कर रहे थे, जिसका तर्क अंत में सभी स्तरों का तात्पर्य है, मैं कहूंगा कि मैं सरलता से खुश हूं लॉजिक, भले ही यह हमला करे आप सिर्फ अपने आवेदन मॉडल की अवधारणाओं को संशोधित करने के बजाय सोचने के लिए।