Roland Ewald'ın cevabını beğendim, çünkü tür takma adı çok basit bir kullanım durumu ile tanımladı ve daha ayrıntılı olarak çok güzel bir öğretici tanıttı. Ancak, bu üyeler adlı yazıya başka bir kullanım durumu eklendiğinden, çok sevdiğim en pratik kullanım durumundan bahsetmek istiyorum: (bu bölüm buradan alınır) :)
Özet Türü:
type T
Yukarıdaki T, kullanılacak olan bu tipin henüz bilinmediğini ve somut alt sınıfa bağlı olarak tanımlanacağını söylüyor. Programlama kavramlarını her zaman anlamanın en iyi yolu bir örnek sunmaktır: Aşağıdaki senaryolara sahip olduğunuzu varsayalım:
Burada derleme hatası alırsınız, çünkü inek ve kaplan sınıflarındaki yemek yöntemi, Animal sınıfındaki eat yöntemini geçersiz kılmaz, çünkü parametre türleri farklıdır. Sınıfta Çimen, Sınıfta Et vs Kaplanda Sınıfta Gıda Süper sınıf olan ve tüm alt sınıfların uyması gerekir.
Şimdi soyutlamaya geri dönelim, aşağıdaki şema ile ve basitçe bir tür soyutlama ekleyerek, alt sınıfın kendisine göre girişin türünü tanımlayabilirsiniz.
Şimdi aşağıdaki kodlara bakın:
val cow1: Cow = new Cow
val cow2: Cow = new Cow
cow1 eat new cow1.SuitableFood
cow2 eat new cow1.SuitableFood
val tiger: Tiger = new Tiger
cow1 eat new tiger.SuitableFood // Compiler error
Derleyici mutlu ve tasarımımızı geliştiriyoruz. İnekimizi inekle besleyebiliriz.UygunYemek ve derleyici, Tiger'a uygun yiyeceklerle ineği beslememizi engeller. Peki ya inek1 UygunGıda ve inek2 SuitabeFood türü arasında fark yaratmak istersek. Başka bir deyişle, bazı senaryolarda, türe ulaştığımız yolun (elbette nesne aracılığıyla) temelde olması çok yararlı olacaktır. Skala'daki gelişmiş özellikler sayesinde şunlar mümkündür:
Yola bağlı türler:
Scala nesneleri üye olarak türlere sahip olabilir. Türün anlamı, ona erişmek için kullandığınız yola bağlıdır. Yol, bir nesneye (sınıfın bir örneği olarak) referansla belirlenir. Bu senaryoyu uygulamak için İnek içindeki Çim sınıfını tanımlamanız gerekir, yani İnek dış sınıf ve Çim iç sınıftır. Yapı şöyle olacak:
class Cow extends Animal {
class Grass extends Food
type SuitableFood = Grass
override def eat(food: this.SuitableFood): Unit = {}
}
class Tiger extends Animal {
class Meat extends Food
type SuitableFood = Meat
override def eat(food: this.SuitableFood): Unit = {}
}
Şimdi bu kodu derlemeye çalışırsanız:
1. val cow1: Cow = new Cow
2. val cow2: Cow = new Cow
3. cow1 eat new cow1.SuitableFood
4. cow2 eat new cow1.SuitableFood // compilation error
4. satırda bir hata göreceksiniz çünkü Çim artık bir İnek iç sınıfıdır, bu nedenle bir Çim örneği oluşturmak için bir inek nesnesine ihtiyacımız vardır ve bu inek nesnesi yolu belirler. Böylece 2 inek nesnesi 2 farklı yol ortaya çıkarır. Bu senaryoda, cow2 sadece bunun için yaratılmış yiyecekleri yemek istiyor. Yani:
cow2 eat new cow2.SuitableFood
Şimdi herkes mutlu :-)