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 կառուցվածքի միջոցով։