Bagaimana Anda menyediakan konstruktor kelebihan beban di Scala?
135
Perlu disebutkan secara eksplisit bahwa Konstruktor Tambahan di Scala harus memanggil jawaban konstruktor utama (seperti pada landon9720), atau konstruktor bantu lain dari kelas yang sama, sebagai tindakan pertama mereka. Mereka tidak bisa begitu saja memanggil konstruktor superclass secara eksplisit atau implisit seperti yang mereka dapat di Jawa. Ini memastikan bahwa konstruktor utama adalah satu-satunya titik masuk ke kelas.
class Foo(x: Int, y: Int, z: String) {
// default y parameter to 0
def this(x: Int, z: String) = this(x, 0, z)
// default x & y parameters to 0
// calls previous auxiliary constructor which calls the primary constructor
def this(z: String) = this(0, z);
}
new Foo(x=2,z=4)
dannew Foo(z=5)
jika Anda mengubah baris pertama Anda keclass Foo(x: Int = 0, y: Int = 0, z: String) {
new
kata kunci diperlukan bahkan untuk kelas kasus.sumber
Pada Scala 2.8.0 Anda juga dapat memiliki nilai default untuk parameter konstruktor dan metode. Seperti ini
Parameter dengan nilai default harus datang setelah yang tanpa nilai default dalam daftar parameter.
sumber
class Foo(val x:Int, y:Int=2*x)
tidak bekerja.new Foo(x=2,z=4)
akan dicetakFoo(2,0,4)
.Sambil melihat kode saya, saya tiba-tiba menyadari bahwa saya melakukan overload pada konstruktor. Saya kemudian ingat pertanyaan itu dan kembali untuk memberikan jawaban lain:
Di Scala, Anda tidak bisa membebani konstruktor, tetapi Anda bisa melakukan ini dengan fungsi.
Juga, banyak yang memilih untuk menjadikan
apply
fungsi objek pendamping sebagai pabrik untuk kelas masing-masing.Membuat kelas ini abstrak dan membebani
apply
fungsi untuk mengimplementasikan-instantiate kelas ini, Anda memiliki "konstruktor" kelebihan beban Anda:Perhatikan bahwa saya secara eksplisit menentukan masing
apply
- masing untuk kembaliExpectation[T]
, jika tidak maka akan mengembalikan bebek yang diketikExpectation[T]{val expected: List[T]}
.sumber
Coba ini
sumber