Saya perhatikan bahwa kompilator tidak akan membiarkan saya mengganti properti tersimpan dengan nilai tersimpan lain (yang tampak aneh):
class Jedi {
var lightSaberColor = "Blue"
}
class Sith: Jedi {
override var lightSaberColor = "Red" // Cannot override with a stored property lightSaberColor
}
Namun, saya diizinkan melakukan ini dengan properti yang dihitung:
class Jedi {
let lightSaberColor = "Blue"
}
class Sith: Jedi {
override var lightSaberColor : String{return "Red"}
}
Mengapa saya tidak diizinkan memberikan nilai lain?
Mengapa menimpa dengan properti yang disimpan adalah kekejian dan melakukannya dengan yang dihitung halal? Apa yang mereka pikirkan?
inheritance
swift
properties
overriding
cfischer
sumber
sumber
Jawaban:
Anda pasti diizinkan memberi properti warisan nilai yang berbeda. Anda dapat melakukannya jika Anda menginisialisasi properti dalam konstruktor yang mengambil nilai awal tersebut, dan meneruskan nilai yang berbeda dari kelas turunan:
Mengganti properti tidak sama dengan memberinya nilai baru - ini lebih seperti memberi kelas properti yang berbeda. Faktanya, itulah yang terjadi ketika Anda mengganti properti yang dihitung: kode yang menghitung properti di kelas dasar diganti dengan kode yang menghitung penggantian untuk properti itu di kelas turunan.
Selain pengamat, properti yang disimpan tidak memiliki perilaku, jadi sebenarnya tidak ada yang perlu diganti. Memberikan properti nilai yang berbeda dimungkinkan melalui mekanisme yang dijelaskan di atas. Ini persis seperti yang coba dicapai contoh dalam pertanyaan, dengan sintaks yang berbeda.
sumber
Bagi saya, contoh Anda tidak berfungsi di Swift 3.0.1.
Saya masukkan di taman bermain kode ini:
Melempar kesalahan pada waktu kompilasi di Xcode:
Tidak, Anda tidak dapat mengubah jenis properti yang disimpan. Prinsip Substitusi Liskov memaksa Anda untuk mengizinkan subclass digunakan di tempat di mana superclass diinginkan.
Tetapi jika Anda mengubahnya menjadi
var
dan oleh karena itu menambahkanset
dalam properti yang dihitung, Anda dapat mengganti properti yang disimpan dengan properti yang dihitung dari tipe yang sama.Hal ini dimungkinkan karena masuk akal untuk beralih dari properti tersimpan ke properti yang dihitung.
Tetapi mengganti
var
properti yang disimpan dengan properti yang disimpanvar
tidak masuk akal, karena Anda hanya dapat mengubah nilai properti.Namun, Anda tidak dapat mengganti properti tersimpan dengan properti tersimpan sama sekali.
Saya tidak akan mengatakan Sith adalah Jedi :-P. Oleh karena itu jelas bahwa ini tidak dapat bekerja.
sumber
sumber
Anda mungkin ingin memberikan nilai lain ke properti:
sumber
Untuk Swift 4, dari dokumentasi Apple :
sumber
Di Swift, sayangnya hal ini tidak mungkin dilakukan. Alternatif terbaik adalah sebagai berikut:
sumber
Saya memiliki masalah yang sama untuk menetapkan konstanta untuk pengontrol tampilan.
Karena saya menggunakan pembuat antarmuka untuk mengelola tampilan, saya tidak dapat menggunakan
init()
, jadi solusi saya mirip dengan jawaban lain, kecuali saya menggunakan variabel hitung hanya-baca pada kelas dasar dan kelas yang diwariskan.sumber
Jika Anda mencoba melakukan itu di Swift 5, Anda akan disambut oleh a
Taruhan terbaik Anda adalah mendeklarasikannya sebagai properti yang dihitung.
Ini berfungsi karena kami hanya mengganti
get {}
fungsinyasumber
Swift tidak mengizinkan Anda mengganti variabel,
stored property
bukan ini yang bisa Anda gunakancomputed property
Ini lebih jelas jika dibandingkan dengan Java, di mana bidang kelas tidak dapat ditimpa dan tidak mendukung polimorfisme karena ditentukan dalam waktu kompilasi (berjalan efisien). Disebut variabel bersembunyi [About] Tidak disarankan menggunakan teknik ini karena sulit dibaca / didukung
[Properti Swift]
sumber
Anda juga dapat menggunakan fungsi untuk mengganti. Ini bukan jawaban langsung, tapi bisa memperkaya topik ini)
Kelas A
Kelas B: A
sumber