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-ის ცილინდრებზე Car-ის მეშვეობით
}
ამ მაგალითში, Car აქვს Engine, მაგრამ Car არ არის Engine-ის ქვესკლასი. ჩვენ უბრალოდ მარტივად ვიღებთ წვდომას Engine-ის ველებს და მეთოდებს Car სტრუქტურის მეშვეობით.