Жалпы жана абстракттуу класстын окшоштуулугу жана айырмачылыгы эмнеде?
sobes.tech AI
AIден жооп
Голангда "普通 класс" жана "абстрактный класс" деген түшүнүктөр Java же C# сыяктуу объектке багытталган тилдерде кандайча бар болсо, ошондой формада жок.
Бирок, алардын функцияларын структуралар жана интерфейстер колдонуп имитациялоо мүмкүн.
Окшоштуктар (Голангда структуралар жана интерфейстер аркылуу):
- Кийим (маалыматтар): Структура сыяктуу класс өзүнүн касиеттерин сактай турган талааларды камтышы мүмкүн.
- Ашулуш (методдор): Структурага методдорду кошсо болот, алар анын жүрүм-турумун аныктайт, ошондой эле класс методдоруна окшош.
- Жалпы келишим (абстрактный класс жана интерфейс үчүн): Голангдагы интерфейс бардык структуралар аткарышы керек болгон методдордун топтомун аныктайт, "аткарган" структура бул интерфейсти ишке ашырган болот. Бул башка тилдердеги абстрактный класс же интерфейс наследдер же ишке ашыруу класстары үчүн келишим түзөт дегенге окшош.
Айырмачылыктар (Голанг контекстинде):
| Белги | "普通 класс" (методдор менен структура) | "Абстрактный класс" (интерфейс + структуралар) |
|---|---|---|
| Түз түзүү | Структуранын экземплярын түзө аласыз. | Интерфейстин экземплярын түзө албайсыз. |
| Методдорду ишке ашыруу | Бардык методдор структурага кошулуп, ишке ашырылат. | Интерфейс методдорду гана декларациялайт, алардын ишке ашырылышы жок. |
| Мурас алуу | Традициялык мааниде мурас албайт. Композицияны (структураларды киргизүү) колдонсо болот. | Интерфейс мурас албайт, структуралар аны ишке ашырат. |
| Ишке ашыруу милдеттүүлүгү | Белгилүү методдор топтомун ишке ашыруу милдеттүү эмес, структурага кошулган методдордан башка. | Golang интерфейсин "ишке ашырган" структура анын бардык методдорун камсыз кылышы керек. |
| Күйгүзүү (поле) сактоо | Структурада маалымат талаалары болушу мүмкүн. | Интерфейс маалымат талааларын камтыбайт. |
Ишке ашыруу үчүн мисал:
// интерфейс, абстрактный класс сыяктуу
type Shape interface {
Area() float64
Perimeter() float64
}
// структура, обык классты имитациялайт
type Circle struct {
Radius float64
}
// интерфейс методдорунун ишке ашырылышы Circle үчүн
func (c Circle) Area() float64 {
return 3.14 * c.Radius * c.Radius
}
func (c Circle) Perimeter() float64 {
return 2 * 3.14 * c.Radius
}
// Башка структура, интерфейсин ишке ашырат
type Rectangle struct {
Width, Height float64
}
func (r Rectangle) Area() float64 {
return r.Width * r.Height
}
func (r Rectangle) Perimeter() float64 {
return 2 * (r.Width + r.Height)
}
Бул мисалда Shape келишим катары ( башка тилдердеги абстрактный класс же интерфейс сыяктуу), ал эми Circle жана Rectangle конкреттүү ишке ашырылуулар (обык класстар сыяктуу). Биз Circle жана Rectangle экземплярдарын түзө алабыз, бирок Shape экземплярын түзө албайбыз. Эки структура да Area() жана Perimeter() методдорун ишке ашырышы керек, алардын Shape интерфейсин "ишке ашыруу" үчүн.