Kurs
DataCamp kısa süre önce ilk Scala kursunu başlattı: Scala’ya Giriş. Göz atın!
Aşağıdaki eğitimleri okumakla da ilgilenebilirsiniz:
- Scala için Yeni Başlayanlar Rehberi
- Scala’da IF ELSE
- Scala’da Operatörler
- Scala’da Listeler
- Scala Sınıfları ve Nesneleri
Giriş
Trait, nesne yönelimli programlamada ağırlıklı olarak kullanılan ve bir sınıfın işlevselliğini bir dizi yöntemle genişletebilen bir kavramdır.
Trait’ler, ruhu itibarıyla Java programlama dilindeki arayüzlere benzer. Bir sınıfın aksine, Scala trait’leri somutlaştırılamaz ve hiçbir argüman ya da parametre almaz. Ancak, sınıflar ve nesneler kullanılarak bunlardan kalıtım (extend) alınabilir. Öyle ki trait’ler, bir sınıfa davranış kazandıran belirli bir yöntem/fonksiyon kümesi sunar ve bu davranışı özelleştirmek için sınıfın belirli yöntemleri uygulamasını bekler.
Bir nesneyi tanımlamak için kullanılan trait, çoklu kalıtım gerektirmeden farklı sınıflar tarafından kullanılabilecek yöntemlerin bir karması olarak oluşturulur. Ancak, iki trait’in aynı ada sahip bir yönteme (ad çakışması) sahip olduğu ve bunların bir sınıf tarafından kullanılması gereken istisnalar olabilir; bu durumda belirsizlik açıkça giderilmelidir.
Trait’ler, üyeleri olarak hem soyut hem de soyut olmayan yöntemler ve alanlara sahip olabilir. Bir trait’te bir yöntemi başlatmazsanız (tanımlamazsanız) bunlar soyut olur; başlatılanlar ise soyut olmayan olarak adlandırılır. Soyut yöntemlerde, trait’i uygulayan sınıf başlatmayı üstlenir.
Şimdi, bazı örneklerin yardımıyla Scala trait’lerini hızlıca anlayalım!
Scala Trait Sözdizimi
Scala trait’inin sözdizimi basittir; trait anahtar sözcüğünün ardından trait’in adı gelir.
trait Trait_Name{
// Variables
// Methods
}

Yukarıdaki trait tanımından da görebileceğiniz gibi, içinde hiçbir değişken ve yöntem tanımlanmamış DataCamp adlı bir trait tanımlanmıştır.
Gelin, Scala trait’lerine basit bir örnekle geçelim; bu, programatik olarak nasıl çalıştıkları konusunda size daha fazla netlik kazandıracaktır.
Giriş bölümünde tartışıldığı gibi, Scala Trait’leri bir sınıf tarafından extends anahtar sözcüğü kullanılarak kalıtılır.
class Scala_Tutorial extends DataCamp{
// Variables
// Methods
}
Scala_Course adlı bir trait tanımlayalım; bu trait, DataCamp sınıfı tarafından kalıtılacaktır. trait içinde, DataCamp sınıfında tanımlanacak scala() adlı bir soyut yöntem tanımlayacaksınız.
trait Scala_Course{
def scala()
}
class DataCamp extends Scala_Course{
def scala(){
println("DataCamp has recently launched there first Scala course")
}
}
object Main{
def main(args:Array[String]){
var a = new DataCamp()
a.scala()
}
}
Şimdi yukarıdaki kodu çalıştıralım.

Yukarıdaki örnekte, scala() yöntemi soyuttu; bu nedenle, bu trait’i kalıtım yoluyla alan sınıfta bildirim yapıldı.
Peki, trait’te zaten uygulanmış (soyut olmayan) bir yönteminiz varsa ne olur? Bu durumda, bu trait’i genişleten sınıfın, trait’te zaten uygulanmış olan yöntemi yeniden uygulamasına gerek yoktur.
Bunu küçük bir örnekle anlayalım.
trait BMW{
// trait variables
var make: String = "BMW"
var model: String = "X7"
var fuel: Int = 40
// trait method: NON-ABSTRACT
def Display()
{
println("Make of the Car : " + make);
println("Model of the Car : " + model);
println("Fuel capacity of the Car : " + fuel);
}
}
class Car extends BMW{
// class variables
var make1: String = "Mercedes Benz"
var model1: String = "S350D"
var fuel1: Int = 50
// Class method
def Merc_Specs()
{
println("Make of the Car : " + make1);
println("Model of the Car : " + model1);
println("Fuel capacity of the Car : " + fuel1);
}
}
object Main
{
// Main method
def main(args: Array[String])
{
// Class object
var obj = new Car();
println("Calling the Class Method")
obj.Merc_Specs();
println("Calling the Trait Method")
obj.Display();
}
}
Yukarıdaki kodu çalıştıralım:

Artık soyut ve soyut olmayan yöntemler arasındaki farkı anladığınıza göre, soyut bir yöntem, onu kalıtım yoluyla alan veya genişleten sınıfta uygulanmazsa neler ters gidebilir, buna bakalım.
Bu kavramı anlamak için aynı örneği kullanalım.
trait Scala_Course{
def scala()
}
class DataCamp extends Scala_Course{
def print(){
println("Error: Class DataCamp needs to be Abstract")
}
}
object Main{
def main(args:Array[String]){
var a = new DataCamp()
a.print()
}
}
Yukarıdaki kodu çalıştırmak, aşağıda gösterildiği gibi bir hatayla sonuçlanır; çünkü trait yöntemi scala() (soyut) onu kalıtım yoluyla alan sınıfta tanımlanmadı.

Yukarıdaki kodu çalışır hale getirmek için iki olası çözüm vardır:
DataCampsınıfındascala()yöntemini tanımlayın veya- DataCamp sınıfını
abstractolarak tanımlayın.
Bugünkü eğitimin son konusu, tek bir sınıfta birden fazla trait’i nasıl kalıtabileceğiniz. Hızla tamamlayalım.
trait A{
// methods
}
trait B{
// methods
}
class C extends A with B{
}
trait BMW{
var make: String = "BMW"
var model: String = "X7"
var fuel: Int = 40
}
trait Merc{
var make1: String = "Mercedes Benz"
var model1: String = "S350D"
var fuel1: Int = 50
}
class Car extends BMW with Merc{
def BMW_Specs()
{
println("Make of the Car : " + make);
println("Model of the Car : " + model);
println("Fuel capacity of the Car : " + fuel);
}
def Merc_Specs()
{
println("Make of the Car : " + make1);
println("Model of the Car : " + model1);
println("Fuel capacity of the Car : " + fuel1);
}
}
object Main
{
// Main method
def main(args: Array[String])
{
// Class object
var obj = new Car();
println("Calling the BMW Trait")
obj.BMW_Specs();
println();
println("Calling the Merc Trait")
obj.Merc_Specs();
}
}
Son olarak, yukarıdaki kodu çalıştıralım.

Tebrikler!
Bu eğitimi tamamladığınız için tebrikler.
Artık programlamada Trait’lerin ne olduğunu ve Scala’da nasıl kullanılacağını biliyorsunuz. Sizin için iyi bir alıştırma, soyut bir yöntemin, onu kalıtım yoluyla alan sınıfta tanımlanmadığı durumda bir çözüm bulmak olabilir. Aynısı için kod yazmayı deneyin ve kodun derleme hatası olmadan çalışıp çalışmadığını görün. Küçük bir ipucu: Scala’daki Soyut Sınıflara bakmak isteyebilirsiniz.
Bu eğitimle ilgili her türlü sorunuzu aşağıdaki yorumlar bölümünde sormaktan çekinmeyin.
Son olarak, DataCamp’teki yeni Scala kursunu unutmayın: Scala’ya Giriş.
