2016-04-12 19 views
-1

Aşağıdaki örnekte, "bir alandaki bir yapının gömülmesi" noktasının, Go'nun "promosyon" mekanizmasını kırmak olduğu görülmektedir. Bunu neden yapmak istersiniz?Bir yapının bir alana (golang) yerleştirilmesinin amacı nedir?

type obj1 struct { 
    obj2 
} 

type obj1Selector struct { 
    selector obj2 
} 

type obj2 struct { 
} 

func (o obj2) printTest() { 
    fmt.Println("obj2") 
} 

func main() { 
    o := obj1{} 
    o.printTest() //fine 

    oSelector := obj1Selector{} 
    oSelector.selector.printTest() //fine 
    oSelector.printTest() //not fine 
+4

Bunu her kullandığınızda, bir yavru kedi ölür. [Etkin Go] (https://golang.org/doc/effective_go.html) kurallarına uyun ve uygun bir ad verin. Örneğin: 'fonk (o obj2) printTest (...)' – eduncan911

+2

seni soruyorsun ya da "go/türleri" paketine hiç ilişkisini (Kullanmadığınız olan) anlamadım . Burada ne olmasını bekliyorsun? – JimB

+1

Bunu düzeltdim. Lütfen hayvanları incitmeyi bırak. – Charlie

cevap

1

Hiçbir şey aliasing değiliz ve seçiciler nokta gösterimi kullanılarak bir türüne başvurulabilir şeylerin kümesine başvurur. Gömme, obj1 gömülü denir obj2 bir kavram kullanıyorsunuz. obj1Selector, obj2 türünde selector adlı tek bir alana sahiptir. Ve diğer ad bu şekilde görünecekti; obj2 için bir diğer ad olarak obj3 bildiren type obj3 obj2.

Go'nun promosyon mekanizmasını bozuyor mu? Üzgünüm, ama bunun nasıl çalıştığına dair tüm fikrin temelini atmıyor. obj1obj2 gömer ve bunun da alanlar/yöntemleri 'terfi' olduğunu vardır, 'terfi' obj1Selector tip obj2 gömmek değildir ve bunun obj2 hiçbir alan/yöntemleri vardır. obj1Selector bu arabirimi uygulamıyor, obj1Selector.selector yapar.

Neden gömmek istiyorum? Eh, mirasa biraz eşittir ya da en azından Go geliştirirken benzer bir özellik kümesi sağlar. Belki de bir veri deposunda 10 ortak alanın paylaşıldığı ve sonra hangi tablodan çıktıklarına bağlı 10 alan daha var. Tıpkı C++, C# veya Java gibi tipik OO dillerinde çoğaltmayı azaltmak için miras kullanmayı tercih ediyorum. Benim düşünceme göre bunun için ana kullanım durumudur. Bir çeşit garip bileşim ve miras karışımı. Başkalarının (yani gömdüğünüz nesnelerin) nesnesini oluşturuyorsunuz ama gömülü tipler/alanlar embedörlerin kapsamına terfi ettiğinden, gömülü tipten miras alınan embedor gibi çok işlev görüyor. Umarım burada uğraştığınız şeyle ilgili bir açıklama yaparsınız. Gerçekten cevaplanabilecek bir soru sormadınız, ancak yorumlarınızda bu kadar uzun bir açıklama ya da yorumunuz yok. Örnek kodunuzu yeniden kullanın.

+0

Cevabınız, bir takma ad oluşturmadığımı anlamanıza yardımcı oluyor, ancak yine de sizin neden dediğiniz gibi bir tarza neden gömüleceğini bilmiyorum. Söylediğiniz gibi bu "miras" karıştırmak olmaz ve kompozisyon tek bir tipte çok kafa karıştırıcı bir yoldur? – Charlie

+0

@Charlie, bu iki kavramın farklı olduğu bir dilden gelen biraz kafa karıştırıcı görünebilir, ancak kullanmaya başladığınızda oldukça sezgiseldir. Tipik OO dillerinde ebeveyn ve çocuk sınıflarını kullanmak gibi bir miras hiyerarşisi istiyorsanız, bunun yerine aynı işlevselliği elde etmek için temel türünü başkalarına da gömün. İşleyiş tarzına dair bazı incelikler var ama muhtemelen mirasa eşdeğer olarak bakmaya başlamak en kolay yol. – evanmcdonnal

+0

Cevabınız benim soruma cevap vermedi, ancak söylememe yardımcı olduğunuzu takdir ediyorum. Lütfen rafine edilmiş sorularımı http://stackoverflow.com/questions/36704522/why-would-you-want-to-use-composition-in-golang adresinde okuyun. – Charlie