Junior
Koje su sličnosti i razlike između obične i apstraktne klase?
sobes.tech АИ
Одговор од АИ
У Golang нема појам као што су "обичан клас" и "апстрактан клас" у облику како постоје у објектно-оријентисаним језицима као што су Java или C#.
Међутим, њихову функционалност може се имитирати коришћењем структура и интерфејса.
Сличности (коришћењем структура и интерфејса у Golang):
- Стање (податци): Структура може садржати поља, као обичан клас који чува својства.
- Понашање (методе): Структури се могу придружити методе које одређују њено понашање, слично методама обичног класа.
- Општи уговор (за апстрактни клас и интерфејс): Интерфејс у Golang дефинише скуп метода које мора реализовати било која структура која "реализује" тај интерфејс. Ово је слично ономе како апстрактни клас или интерфејс у другим језицима поставља уговор за наследнике или реализујуће класе.
Разлике (у контексту Golang):
| Карактеристика | "Обичан клас" (структура са методама) | "Апстрактан клас" (интерфејс + структуре) |
|---|---|---|
| Прямо креирање | Може се креирати примерак структуре. | Не може се креирати примерак интерфејса. |
| Реализација метода | Све методе, придружене структури, имају реализацију. | Интерфејс само декларише методе, али не и њихову реализацију. |
| Наслеђивање | Нема јасног наслеђивања у класичном смислу. Може се користити композиција (украјина структура). | Интерфејс се не наслеђује, већ реализују структуре. |
| Обавезност реализације | Нема принуде за реализацију одређеног скупа метода, осим оних које су придружене структури. | Свако структуре која "реализује" интерфејс у 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.