Sobes.tech
Junior

Normal ve soyut sınıfın benzerlikleri ve farkları nelerdir?

sobes.tech yapay zeka

AI'dan gelen yanıt

Golang'da, nesne yönelimli dillerde Java veya C# gibi, "sıradan sınıf" ve "soyut sınıf" kavramları yoktur.

Ancak, fonksiyonellikleri yapıları ve arayüzleri kullanarak taklit edilebilir.

Benzerlikler (Golang'de yapılar ve arayüzler kullanarak):

  • Durum (veriler): Yapı, normal bir sınıfın özellikleri gibi alanlar içerebilir.
  • Davranış (metodlar): Yapıya metodlar eklenebilir, bu da onun davranışını tanımlar, tıpkı normal bir sınıfın metodları gibi.
  • Ortak sözleşme (soyut sınıf ve arayüz için): Golang'deki arayüz, bu arayüzü "uygulayan" herhangi bir yapının uygulaması gereken metodların bir kümesini tanımlar. Bu, diğer dillerdeki soyut sınıf veya arayüzlerin, kalıtım alan veya uygulayan sınıflar için sözleşme belirlemesine benzer.

Farklar (Golang bağlamında):

Özellik "Sıradan sınıf" (metodlarla yapı) "Soyut sınıf" (arayüz + yapılar)
Doğrudan oluşturma Yapı örneği oluşturulabilir. Arayüz örneği oluşturulamaz.
Metodların uygulanması Yapıya eklenen tüm metodlar uygulamaya sahiptir. Arayüz sadece metodları bildirir, uygulamasını içermez.
Kalıtım Geleneksel anlamda açık kalıtım yoktur. Yapıların bileşimi (birleştirme) kullanılabilir. Arayüz kalıtım almaz, yapılar tarafından uygulanır.
Uygulama zorunluluğu Belirli metodların uygulanması zorunlu değildir, yapı ile ilişkilendirilmiş olanlar hariç. Her yapı, Golang arayüzünü "uyguladığında", tüm metodlarını sağlamalıdır.
Durum (alanlar) depolama Yapı, veri alanları içerebilir. Arayüz veri alanı içermez.

İşte taklit örneği:

// soyut sınıfı taklit eden arayüz
type Shape interface {
	Area() float64
	Perimeter() float64
}

// sıradan sınıfı taklit eden yapı
type Circle struct {
	Radius float64
}

// arayüz metodlarının uygulaması için Circle
func (c Circle) Area() float64 {
	return 3.14 * c.Radius * c.Radius
}

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

// Arayüzü uygulayan başka bir yapı
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)
}

Bu örnekte, Shape bir sözleşme (diğer dillerdeki soyut sınıf veya arayüz gibi) olarak hareket eder ve Circle ile Rectangle somut uygulamalardır (sıradan sınıflara benzer). Circle ve Rectangle örnekleri oluşturabiliriz, ancak doğrudan Shape örneği oluşturamayız. Ayrıca, her iki yapı da Area() ve Perimeter() metodlarını uygulamalıdır, böylece Shape arayüzünü "yerine getirirler".