Sobes.tech
Junior

Oddiy va abstrakt sinfning o'xshashligi va farqi nima?

sobes.tech AI

AIdan javob

Golang'da, ob'ekt-orientatsiya tillarida Java yoki C# kabi, "oddiy sinf" va "abstrakt sinf" tushunchalari mavjud emas.

Biroq, ularning funksionalligi strukturalar va interfeyslar yordamida taqlid qilish mumkin.

O'xshashliklar (Golang'da strukturalar va interfeyslar yordamida):

  • Holat (ma'lumotlar): Strukturada odatiy sinf kabi xususiyatlarni saqlovchi maydonlar bo'lishi mumkin.
  • Xulq-atvor (metodlar): Strukturaga metodlar qo'shish mumkin, ular uning xulq-atvorini belgilaydi, odatiy sinf metodlariga o'xshash.
  • Umumiy shartnoma (abstrakt sinf va interfeys uchun): Golang'dagi interfeys, bu interfeysni "amalga oshiradigan" har qanday strukturada bajarilishi kerak bo'lgan metodlar to'plamini belgilaydi. Bu boshqa tillardagi abstrakt sinf yoki interfeysning vorislik yoki amalga oshirish uchun shartnoma belgilashiga o'xshaydi.

Farqlar (Golang kontekstida):

Xususiyat "Oddiy sinf" (metodlar bilan struktur) "Abstrakt sinf" (interfeys + strukturalar)
To'g'ridan-to'g'ri yaratish Strukturadan nusxa yaratish mumkin. Interfeysning nusxasini yaratish mumkin emas.
Metodlarni amalga oshirish Strukturaga bog'langan barcha metodlar amalga oshirilgan bo'lishi kerak. Interfeys faqat metodlarni e'lon qiladi, ularning amalga oshirilishini emas.
Merosi An'anaviy ma'noda meros yo'q. Kompozitsiya (strukturalarni qo'shish) ishlatilishi mumkin. Interfeys meros olmaydi, balki strukturalar tomonidan amalga oshiriladi.
Majburiy amalga oshirish Muayyan metodlar to'plamini amalga oshirish majburiy emas, faqat strukturaga bog'langanlar. Har qanday struktur, Golang interfeysini "amalga oshirgan" bo'lsa, uning barcha metodlarini taqdim etishi kerak.
Holatni saqlash (maydonlar) Strukturada ma'lumot maydonlari bo'lishi mumkin. Interfeys ma'lumot maydonlarini o'z ichiga olmaydi.

Taqlid misoli:

// abstrakt sinfni taqlid qiluvchi interfeys
type Shape interface {
	Area() float64
	Perimeter() float64
}

// oddiy sinfni taqlid qiluvchi struktur
type Circle struct {
	Radius float64
}

// Circle uchun interfeys metodlarining amalga oshirilishi
func (c Circle) Area() float64 {
	return 3.14 * c.Radius * c.Radius
}

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

// Interfeysni amalga oshiradigan boshqa struktur
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)
}

Ushbu misolda, Shape shartnoma sifatida ishlaydi (boshqa tillardagi abstrakt sinf yoki interfeysga o'xshash), va Circle ham Rectangle ham konkret amalga oshirishlar (odatiy sinflarga o'xshash). Biz Circle va Rectangle nusxalarini yaratishimiz mumkin, lekin Shape ning nusxasini to'g'ridan-to'g'ri yaratish mumkin emas. Shuningdek, ikkala strukturada Area() va Perimeter() metodlarini amalga oshirishlari kerak, shunda ular Shape interfeysini "bajarishadi".