Trait adalah konsep yang banyak digunakan dalam pemrograman berorientasi objek, yang dapat memperluas fungsionalitas suatu kelas menggunakan sekumpulan metode.
Trait mirip dengan interface dalam bahasa pemrograman Java. Tidak seperti kelas, trait Scala tidak dapat diinstansiasi dan tidak memiliki argumen atau parameter. Namun, Anda dapat mewarisinya (extend) menggunakan kelas dan objek. Dengan demikian, trait menyediakan sekumpulan metode/fungsi spesifik yang menjalankan perilaku pada sebuah kelas dan mengharapkan kelas tersebut mengimplementasikan sekumpulan metode yang kemudian memparametrisasi perilaku yang disediakan.
Trait yang digunakan untuk mendefinisikan sebuah objek dibuat sebagai campuran metode yang dapat digunakan oleh berbagai kelas tanpa memerlukan pewarisan berganda. Namun, bisa ada pengecualian ketika dua trait memiliki metode dengan nama yang sama (tabrakan penamaan), yang harus digunakan oleh sebuah kelas; dalam kasus tersebut, ambiguitas harus diselesaikan secara eksplisit.
Trait dapat memiliki metode, field abstrak maupun non-abstrak sebagai anggotanya. Ketika Anda tidak menginisialisasi sebuah metode dalam trait, maka metode tersebut bersifat abstrak, sedangkan yang diinisialisasi disebut non-abstrak. Pada metode abstrak, kelas yang mengimplementasikan trait bertanggung jawab atas inisialisasinya.
Sekarang, mari cepat memahami trait Scala dengan bantuan beberapa contoh!
Sintaks Trait Scala
Sintaks trait Scala cukup sederhana, didefinisikan oleh kata kunci trait diikuti oleh nama trait.
trait Trait_Name{
// Variables
// Methods
}
Seperti yang Anda lihat dari definisi trait di atas, sebuah trait bernama DataCamp didefinisikan, yang tidak memiliki variabel dan metode di dalamnya.
Mari beralih ke contoh sederhana trait Scala, yang akan memberi Anda gambaran yang lebih jelas tentang cara kerjanya secara programatis.
Seperti dibahas dalam pendahuluan, Trait Scala diwarisi oleh sebuah kelas menggunakan kata kunci extends.
class Scala_Tutorial extends DataCamp{
// Variables
// Methods
}
Mari kita definisikan sebuah trait bernama Scala_Course, yang akan diwarisi oleh kelas DataCamp. Di dalam trait, Anda akan mendefinisikan metode abstrak bernama scala(), yang akan didefinisikan dalam kelas DataCamp.
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()
}
}
Sekarang mari kita jalankan kode di atas.
Pada contoh di atas, metode scala() adalah metode abstrak, sehingga deklarasinya dibuat dalam kelas yang mewarisi trait tersebut.
Lalu bagaimana jika Anda memiliki metode (non-abstrak) yang sudah diimplementasikan dalam trait? Dalam hal ini, kelas yang mewarisi trait tersebut tidak perlu mengimplementasikan metode yang sudah diimplementasikan di trait.
Mari pahami ini dengan bantuan contoh kecil.
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();
}
}
Mari jalankan kode di atas:
Sekarang setelah Anda memahami perbedaan antara metode abstrak dan non-abstrak, mari lihat apa yang bisa salah ketika metode abstrak tidak diimplementasikan dalam kelas yang mewarisi atau memperluasnya.
Mari gunakan contoh yang sama untuk memahami konsep ini.
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()
}
}
Menjalankan kode di atas menghasilkan error, seperti yang ditunjukkan di bawah, karena Anda tidak mendefinisikan metode trait scala() (abstrak) dalam kelas yang mewarisinya.
Untuk membuat kode di atas berjalan, ada dua solusi yang mungkin:
Definisikan metode scala() dalam kelas DataCamp atau
Jadikan kelas DataCamp sebagai abstract.
Topik terakhir untuk tutorial hari ini adalah bagaimana Anda dapat mewarisi beberapa trait dalam satu kelas. Jadi, mari kita selesaikan dengan cepat.
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();
}
}
Terakhir, mari jalankan kode di atas.
Selamat!
Selamat telah menyelesaikan tutorial ini.
Sekarang Anda tahu apa itu Trait dalam pemrograman dan cara menggunakannya di Scala. Latihan yang baik untuk Anda adalah mencari solusi untuk metode abstrak ketika tidak didefinisikan dalam kelas yang mewarisinya. Cobalah menulis kode untuk hal yang sama dan lihat apakah kode berjalan tanpa error kompilasi. Sedikit kiat, Anda mungkin ingin melihat Kelas Abstrak di Scala.
Silakan ajukan pertanyaan apa pun terkait tutorial ini di kolom komentar di bawah.
Terakhir, jangan lupa mengikuti kursus Scala baru di DataCamp, Introduction to Scala.
Temukan alasan mengapa Anda sebaiknya (tidak) menggunakan spaghetti plot untuk menyampaikan ketidakpastian jalur prediksi badai serta dampaknya terhadap interpretasi.
Kuasai pertanyaan wawancara basis data, dari konsep SQL dasar hingga skenario desain sistem tingkat lanjut. Panduan mendalam ini mencakup semua yang Anda perlukan untuk sukses di wawancara DBMS dan meraih peran berikutnya.