Sobes.tech
Junior

Care este asemănarea și diferența dintre o clasă obișnuită și o clasă abstractă?

sobes.tech AI

Răspuns de la AI

În Golang, nu există conceptul de "clasă obișnuită" și "clasă abstractă" în forma în care există în limbajele orientate pe obiecte precum Java sau C#.

Cu toate acestea, funcționalitatea lor poate fi imitată folosind structuri și interfețe.

Similarități (folosind structuri și interfețe în Golang):

  • Stare (date): Structura poate conține câmpuri, ca o clasă obișnuită care stochează proprietăți.
  • Comportament (metode): La structură se pot atașa metode, care vor defini comportamentul acesteia, similar cu metodele unei clase obișnuite.
  • Contract comun (pentru clasă abstractă și interfață): Interfața în Golang definește un set de metode pe care orice structură "care implementează" această interfață trebuie să le implementeze. Acest lucru este similar cu modul în care o clasă abstractă sau interfață în alte limbaje stabilește un contract pentru clasele moștenitoare sau care implementează.

Diferențe (în contextul Golang):

Caracteristică "Clasă obișnuită" (structură cu metode) "Clasă abstractă" (interfață + structuri)
Creare directă Se poate crea o instanță a structurii. Nu se poate crea o instanță a interfeței.
Implementarea metodelor Toate metodele atașate structurii au implementare. Interfața doar declară metode, dar nu și implementarea lor.
Moștenire Nu există moștenire explicită în sens clasic. Se poate folosi compoziția (încorporarea structurilor). Interfața nu moștenește, ci este implementată de structuri.
Obligația de implementare Nu există constrângere de a implementa un anumit set de metode, în afară de cele atașate structurii. Orice structură care "implementează" interfața Golang trebuie să ofere implementarea tuturor metodelor sale.
Stocarea stării (câmpuri) Structura poate conține câmpuri de date. Interfața nu conține câmpuri de date.

Exemplu de imitație:

// interfață care imită o clasă abstractă
type Shape interface {
	Area() float64
	Perimeter() float64
}

// structură care imită o clasă obișnuită
type Circle struct {
	Radius float64
}

// implementarea metodelor interfeței pentru Circle
func (c Circle) Area() float64 {
	return 3.14 * c.Radius * c.Radius
}

func (c Circle) Perimeter() float64 {
	return 2 * 3.14 * c.Radius
}

// Altă structură care implementează interfața
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)
}

În acest exemplu, Shape acționează ca un contract (similar cu o clasă abstractă sau interfață în alte limbaje), iar Circle și Rectangle sunt implementări concrete (analogi claselor obișnuite). Putem crea instanțe de Circle și Rectangle, dar nu putem crea direct o instanță de Shape. În plus, ambele structuri trebuie să implementeze metodele Area() și Perimeter() pentru a "îndeplini" interfața Shape.