Sobes.tech
Middle+

Ինչու է Go լեզվում ներդրումը ժառանգություն չէ?

sobes.tech AI

Պատասխան AI-ից

Go- ում ներդնումը (embedding) թույլ է տալիս մեկ կառուցվածքին օգտագործել մյուս կառուցվածքի դաշտերը և մեթոդները՝ կարծես թե դրանք իր սեփականն են:

Հիմնական տարբերությունները ժառանգության հետ:

  • Կոմպոզիցիա vs. Հիրարխիա: Ներդնումը՝ դա կոմպոզիցիայի ձև է ("ունի մի"), որտեղ մի կառուցվածք ունի մյուսին: Ժառանգությունը (քլասիկ OOP-ում)՝ դա հիրարխիայի ձև է ("է մի"), որտեղ մի դաս է մյուսի ենթադասը:
  • Պոլիմորֆիզմ: Go-ն չի աջակցում ժառանգության մեջ ենթատեսակների պոլիմորֆիզմին՝ ավանդական իմաստով: Պոլիմորֆիզմը Go-ում իրականացվում է ինտերֆեյսների միջոցով:
  • Մուտք: Ներդնումը թույլ է տալիս անմիջապես մուտք գործել տեսանելի դաշտեր և մեթոդներ՝ ներգրավված կառուցվածքից՝ արտաքին կառուցվածքի միջոցով, բայց չի ստեղծում տեսակների հիրարխիա:
  • Անհրաժեշտ է վերագրում: Չկա ուղիղ մեխանիզմ՝ վերագրելու բազային դասի մեթոդները: Կարող եք նույն անունով մեթոդ սահմանել արտաքին կառուցվածքում՝ որը "մթնեցնում" է ներգրավված մեթոդը:

Նմուշ՝ ներդրման:

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() // Մուտք գործել Engine-ի Start մեթոդը Car-ի միջոցով
	fmt.Println("Մեքենայի բրենդը:", myCar.Brand)
	fmt.Println("Մեխանիկի ցիլինդրները:", myCar.Cylinders) // Մուտք գործել Engine-ի Cylinders դաշտը Car-ի միջոցով
}

Այս օրինակով, Car պատկանում է Engine, բայց Car չի հանդիսանում Engine-ի ենթատեսակ: Մենք պարզապես հարմարավետ մուտք ենք գործում Engine-ի դաշտեր և մեթոդներ՝ Car կառուցվածքի միջոցով։