में विरासत टाइप विरासत क्यों नहीं है।गो
(अवधारणा है कि जब एक वस्तुओं के एक वर्ग परिभाषित किया गया है, किसी भी उपवर्ग कि परिभाषित किया गया है में से एक या एक से अधिक सामान्य वर्गों परिभाषाओं के वारिस कर सकते हैं)
में विरासत टाइप विरासत क्यों नहीं है।गो
(अवधारणा है कि जब एक वस्तुओं के एक वर्ग परिभाषित किया गया है, किसी भी उपवर्ग कि परिभाषित किया गया है में से एक या एक से अधिक सामान्य वर्गों परिभाषाओं के वारिस कर सकते हैं)
यह F.A.Q. में भाषा रचनाकारों द्वारा उत्तर दिया गया था:
ऑब्जेक्ट उन्मुख प्रोग्रामिंग, कम से कम सबसे प्रसिद्ध भाषाओं में, प्रकारों, संबंधों के बीच संबंधों की बहुत अधिक चर्चा शामिल होती है जो अक्सर स्वचालित रूप से प्राप्त की जा सकती हैं। जाओ एक अलग दृष्टिकोण लेता है।
प्रोग्रामर को दो प्रकार से संबंधित समय से पहले घोषित करने की आवश्यकता के बजाय, एक प्रकार में स्वचालित रूप से किसी भी इंटरफ़ेस को संतुष्ट करता है जो इसके तरीकों का सबसेट निर्दिष्ट करता है। बहीखाता को कम करने के अलावा, इस दृष्टिकोण के असली फायदे हैं। पारंपरिक एकाधिक विरासत की जटिलताओं के बिना, कई बार कई इंटरफेस को संतुष्ट कर सकते हैं। इंटरफ़ेस बहुत हल्के हो सकते हैं-एक इंटरफ़ेस एक या यहां तक कि शून्य विधियों के साथ एक उपयोगी अवधारणा व्यक्त कर सकते हैं। इंटरफेस को तथ्य के बाद जोड़ा जा सकता है यदि मूल विचारों को एनोटेट किए बिना एक नया विचार परीक्षण के साथ आता है या परीक्षण के लिए आता है। क्योंकि प्रकार और इंटरफेस के बीच कोई स्पष्ट संबंध नहीं हैं, प्रबंधन या चर्चा करने के लिए कोई प्रकार पदानुक्रम नहीं है।
यह भी देखें: Composition over inheritance principle।
आप पुन: प्रयोज्य के लिए विरासत की जरूरत है, इस उदाहरण दिखाता है कि मैं एक आकार इंटरफ़ेस की चौड़ाई/ऊंचाई का पुन: उपयोग,
package main
// compare to a c++ example: http://www.tutorialspoint.com/cplusplus/cpp_interfaces.htm
import (
"fmt"
)
// interface
type Shape interface {
Area() float64
GetWidth() float64
GetHeight() float64
SetWidth(float64)
SetHeight(float64)
}
// reusable part, only implement SetWidth and SetHeight method of the interface
// {
type WidthHeight struct {
width float64
height float64
}
func (this *WidthHeight) SetWidth(w float64) {
this.width = w
}
func (this *WidthHeight) SetHeight(h float64) {
this.height = h
}
func (this *WidthHeight) GetWidth() float64 {
return this.width
}
func (this *WidthHeight) GetHeight() float64 {
fmt.Println("in WidthHeight.GetHeight")
return this.height
}
// }
type Rectangle struct {
WidthHeight
}
func (this *Rectangle) Area() float64 {
return this.GetWidth() * this.GetHeight()/2
}
// override
func (this *Rectangle) GetHeight() float64 {
fmt.Println("in Rectangle.GetHeight")
// in case you still needs the WidthHeight's GetHeight method
return this.WidthHeight.GetHeight()
}
func main() {
var r Rectangle
var i Shape = &r
i.SetWidth(4)
i.SetHeight(6)
fmt.Println(i)
fmt.Println("width: ",i.GetWidth())
fmt.Println("height: ",i.GetHeight())
fmt.Println("area: ",i.Area())
}
परिणाम:
&{{4 6}}
width: 4
in Rectangle.GetHeight
in WidthHeight.GetHeight
height: 6
in Rectangle.GetHeight
in WidthHeight.GetHeight
area: 12
एकाधिक वंशानुक्रम आम तौर पर एक से अधिक प्राप्ति के लिए संदर्भित करता है वर्ग, कई इंटरफेस लागू नहीं कर रहा है, और कभी अच्छा नहीं है। गो और पारंपरिक भाषाओं जैसे सी ++ और जावा में बिना किसी झगड़े के कई इंटरफेस लागू करना संभव है और उचित/आवश्यक जहां उचित है। सी ++ में एकाधिक विरासत संभव था लेकिन इस पर फंसे हुए (सिवाय इसके कि सभी एक वर्ग इंटरफ़ेस के रूप में कार्य कर रहे थे - यानी कोई विशेषता या विधि इम्प्रेशन नहीं)। जावा में यह अवैध है, इसलिए यदि आप चाहें तो भी शरारती नहीं हो सकते :) – Volksman