Sobes.tech
Middle+

Чаро дар забони Go дохил кардан мерос нест?

sobes.tech AI

Ҷавоб аз AI

Дарсгирӣ (embedding) дар Go имкон медиҳад, ки як сохтор аз майдонҳо ва усулҳои сохтори дигар истифода барад, гӯё ки онҳо соҳиби худ бошанд.

Фарқиятҳои асосӣ бо мерос:

  • Композиция vs. Иерархия: Даргардонии (embedding) шакли композиция аст ("дорост"), ки дар он як сохтор дорои дигар аст. Мерос (дар OOP классикӣ) шакли иерархия аст ("аст"), ки дар он як синф зери синф аст.
  • Полифросификатсия: Go полиморфизми зери намудҳоро дар маънои анъанавии мерос дастгирӣ намекунад. Полифросификатсия дар Go тавассути интерфейсҳо амалӣ мешавад.
  • Дастрасӣ: Даргардонии майдонҳо ва усулҳои намоёни сохтори даргардонидашуда мустақиман тавассути сохтори беруна дастрас мешаванд, аммо иерархияи намудҳоро намесозад.
  • Намудҳои override: Механизми мустақим барои "навиштани дубора" усулҳои синфи асосӣ вуҷуд надорад. Шумо метавонед усулро бо ҳамон ном дар сохтори беруна муайян кунед, ки усули даргардонидашударо "пинҳон" мекунад.

Масалан даргардонии:

package main

import "fmt"

type Engine struct {
	Cylinders int
}

func (e Engine) Start() {
	fmt.Println("Мотор оғоз шуд бо", e.Cylinders, "силиндра")
}

type Car struct {
	Engine // Даргардонии Engine
	Brand  string
}

func main() {
	myCar := Car{
		Engine: Engine{Cylinders: 4},
		Brand:  "Toyota",
	}
	myCar.Start() // Дастрасӣ ба усули Start-и Engine тавассути Car
	fmt.Println("Бренди мошин:", myCar.Brand)
	fmt.Println("Силиндраҳои муҳаррик:", myCar.Cylinders) // Дастрасӣ ба майдони Cylinders-и Engine тавассути Car
}

Дар ин мисол, Car дорои Engine, аммо Car зери синфи Engine нест. Мо ба осонӣ ба майдонҳо ва усулҳои Engine тавассути сохтори Car дастрасӣ пайдо мекунем.