Sobes.tech
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.