Burada @jimt tarafından verilen cevabı genişletmek istedim . Bu cevap doğrudur ve bunu çözmemde bana çok yardımcı oldu. Bununla birlikte, her iki yöntemde de (takma ad, gömme) sorun yaşadığım bazı uyarılar var.
not : Beste için en iyisinin bu olduğundan emin değilim, ancak ebeveyn ve çocuk terimlerini kullanıyorum. Temel olarak ana, yerel olarak değiştirmek istediğiniz türdür. Çocuk, bu değişikliği uygulamaya çalışan yeni türdür.
Yöntem 1 - Tür Tanımı
type child parent
// or
type MyThing imported.Thing
- Alanlara erişim sağlar.
- Yöntemlere erişim sağlamaz.
type child struct {
parent
}
// or with import and pointer
type MyThing struct {
*imported.Thing
}
- Alanlara erişim sağlar.
- Yöntemlere erişim sağlar.
- Başlatma için dikkate alınması gerekir.
özet
- Kompozisyon yöntemini kullanarak, gömülü üst öğe bir işaretçi ise başlatılmayacaktır. Ebeveyn, ayrı olarak başlatılmalıdır.
- Gömülü üst öğe bir işaretçi ise ve çocuk başlatıldığında başlatılmamışsa, sıfır işaretçi referans hatası oluşacaktır.
- Hem tür tanımı hem de yerleştirme durumları, üst öğenin alanlarına erişim sağlar.
- Tür tanımı ebeveynin yöntemlerine erişime izin vermez, ancak ebeveynin gömülmesi izin verir.
Bunu aşağıdaki kodda görebilirsiniz.
oyun alanında çalışma örneği
package main
import (
"fmt"
)
type parent struct {
attr string
}
type childAlias parent
type childObjParent struct {
parent
}
type childPointerParent struct {
*parent
}
func (p *parent) parentDo(s string) { fmt.Println(s) }
func (c *childAlias) childAliasDo(s string) { fmt.Println(s) }
func (c *childObjParent) childObjParentDo(s string) { fmt.Println(s) }
func (c *childPointerParent) childPointerParentDo(s string) { fmt.Println(s) }
func main() {
p := &parent{"pAttr"}
c1 := &childAlias{"cAliasAttr"}
c2 := &childObjParent{}
// When the parent is a pointer it must be initialized.
// Otherwise, we get a nil pointer error when trying to set the attr.
c3 := &childPointerParent{}
c4 := &childPointerParent{&parent{}}
c2.attr = "cObjParentAttr"
// c3.attr = "cPointerParentAttr" // NOGO nil pointer dereference
c4.attr = "cPointerParentAttr"
// CAN do because we inherit parent's fields
fmt.Println(p.attr)
fmt.Println(c1.attr)
fmt.Println(c2.attr)
fmt.Println(c4.attr)
p.parentDo("called parentDo on parent")
c1.childAliasDo("called childAliasDo on ChildAlias")
c2.childObjParentDo("called childObjParentDo on ChildObjParent")
c3.childPointerParentDo("called childPointerParentDo on ChildPointerParent")
c4.childPointerParentDo("called childPointerParentDo on ChildPointerParent")
// CANNOT do because we don't inherit parent's methods
// c1.parentDo("called parentDo on childAlias") // NOGO c1.parentDo undefined
// CAN do because we inherit the parent's methods
c2.parentDo("called parentDo on childObjParent")
c3.parentDo("called parentDo on childPointerParent")
c4.parentDo("called parentDo on childPointerParent")
}
“extension methods are not object-oriented”
C # için nesne yönelimli olmayan ( ) olarak kabul edilir , ancak bugün onlara baktığımda, Go'nun arayüzlerini (ve nesne yönünü yeniden düşünme yaklaşımını) hemen hatırladım ve sonra bu soruyu sormuştum.