Suatu sealed
sifat dapat diperpanjang hanya dalam file yang sama dengan deklarasi.
Mereka sering digunakan untuk memberikan alternatif enums
. Karena mereka hanya dapat diperluas dalam satu file, kompiler mengetahui setiap subtipe yang mungkin dan dapat mempertimbangkannya.
Misalnya dengan deklarasi:
sealed trait Answer
case object Yes extends Answer
case object No extends Answer
Kompiler akan mengeluarkan peringatan jika kecocokan tidak lengkap:
scala> val x: Answer = Yes
x: Answer = Yes
scala> x match {
| case No => println("No")
| }
<console>:12: warning: match is not exhaustive!
missing combination Yes
Jadi, Anda harus menggunakan sifat tersegel (atau kelas abstrak tersegel) jika jumlah subtipe yang mungkin terbatas dan diketahui sebelumnya. Untuk lebih banyak contoh, Anda dapat melihat daftar dan implementasi opsi .
Sejauh ini
sealed
, ya. Mereka berbagi perbedaan normal antaratrait
danclass
, tentu saja.Moot.
Jika Anda memiliki
sealed class X
, maka Anda harus memeriksaX
dan juga setiap subclass. Hal yang sama tidak berlaku untuksealed abstract class X
atausealed trait X
. Jadi Anda bisa melakukannyasealed abstract class X
, tetapi itu jauh lebih bertele-tele daripada hanyatrait
dan untuk sedikit keuntungan.Keuntungan utama menggunakan
abstract class
overtrait
adalah dapat menerima parameter. Keuntungan itu sangat relevan ketika menggunakan kelas tipe. Katakanlah Anda ingin membuat pohon yang disortir, misalnya. Anda dapat menulis ini:tetapi Anda tidak dapat melakukan ini:
karena batas konteks (dan batas tampilan) diimplementasikan dengan parameter implisit. Mengingat bahwa sifat tidak dapat menerima parameter, Anda tidak dapat melakukannya.
Secara pribadi, saya lebih suka
sealed trait
dan menggunakannya kecuali beberapa alasan tertentu membuat saya menggunakan asealed abstract class
. Dan saya tidak berbicara tentang alasan yang halus, tetapi alasan yang tidak bisa Anda abaikan, seperti menggunakan kelas tipe.sumber
[A: F]
) tidak bekerja dengan cara yang sama seperti batasan varians. Sebaliknya, itu gula sintaksis yang menuntutF[A]
ruang lingkup implisit . Ini umumnya digunakan untuk memanggil instance typeclass dengan cara yang sedikit terser dan lebih mudah dibaca daripada parameter implisit ((implicit fa: F[A])
), tetapi masih bekerja dengan cara yang persis sama di bawah tenda, dan seperti yang ditunjukkan Daniel, sifat-sifat tidak bisa dilakukan bahwa.Dari blog scala harian :
sumber
Saya juga merasa perlu mengarahkan Anda ke spesifikasi:
sumber
secara singkat:
dan untuk lebih jelasnya Segala sesuatu tentang sifat tersegel di Scala
sumber