Тартиби марди гусфандро чист?
sobes.tech AI
Ҷавоб аз AI
Типи кардани қуш (duck typing) услуби типи динамикӣ мебошад, ки дар он навъи объект ё тағирёбанда на асоси мерос ё иҷрои интерфейс, балки дар асоси мавҷуд будани маҷмӯи муайяни усулҳо ё хосиятҳо муайян карда мешавад. Агар объект "мегузарад ҳамчун қуш ва quack мекунад ҳамчун қуш", пас он ҳамчун қуш ҳисобида мешавад.
Дар Go, типи қуш тавассути интерфейсҳои ғайрирасмӣ амалӣ карда мешавад. Сохтор ё ҳар гуна навъи дигар маълумот бояд ба таври расмӣ нишон надода, ки он иҷрои интерфейсро дорад. Кофист, ки навъи маълумот ҳамаи усулҳои дар интерфейс муайяншударо иҷро кунад.
Масалан:
package main
import "fmt"
// Интерфейси Speaker-ро муайян мекунем
type Speaker interface {
Speak()
}
// Сохтори Dog-ро муайян мекунем
type Dog struct{}
// Dog усули Speak()-ро иҷро мекунад
func (d Dog) Speak() {
fmt.Println("Гав!")
}
// Сохтори Cat-ро муайян мекунем
type Cat struct{}
// Cat усули Speak()-ро иҷро мекунад
func (c Cat) Speak() {
fmt.Println("Мяу!")
}
// Ин функсия аргументи типи Speaker-ро қабул мекунад
func MakeItSpeak(s Speaker) {
s.Speak()
}
func main() {
d := Dog{}
c := Cat{}
// Ҳар ду объект, Dog ва Cat, метавонанд ба MakeItSpeak дода шаванд,
// зеро ҳарду ғайрирасмӣ иҷрои Speaker-ро доранд.
MakeItSpeak(d)
MakeItSpeak(c)
}
Дар ин мисол, на Dog ва на Cat расман нишон намедиҳанд, ки онҳо Speaker-ро иҷро мекунанд. Аммо, чун ҳарду дорои методи Speak() ҳастанд, ки бо имзои метод дар интерфейси Speaker мувофиқ аст, метавонанд дар ҷойҳое истифода шаванд, ки интизор аст Speaker.
Афзалиятҳои duck typing дар Go:
- Флексибиллик: Имкон медиҳад, ки системҳои модулӣ ва васеъшаванда ба осонӣ эҷод шаванд.
- Нестии ҳиерархияи сахт: Дар тарҳрезӣ лозим нест, ки ирсӣ гиред ё расман интерфейсҳоро иҷро кунед.
- Истифодаи осон аз навъҳои мавҷуда: Ҳар навъе, ки усулҳои заруриро дорад, метавонад интерфейсро иҷро кунад, ҳатто агар он бе назар ба он таҳия шудааст.