Saya ingin tahu kesamaan apa yang dimiliki pria dan anak dan apa perbedaannya.
class Person {
name: string;
age: number;
}
class child extends Person {}
class man implements Person {}
typescript
extends
implements
davejoem
sumber
sumber
Jawaban:
Versi pendek
extends
cara:Kelas baru adalah anak-anak . Itu mendapat manfaat datang dengan warisan. Ia memiliki semua properti, metode sebagai induknya. Itu dapat menimpa beberapa di antaranya dan menerapkan yang baru, tetapi hal-hal induk sudah disertakan.
implements
cara:Kelas baru bisa diperlakukan sebagai "bentuk" yang sama , meski bukan anak-anak . Itu bisa diteruskan ke metode apa pun yang
Person
diperlukan, terlepas dari memiliki induk yang berbeda dariPerson
Lebih ...
Dalam OOP (bahasa seperti C #, Java) kami akan menggunakan
extends
untuk mendapatkan keuntungan dari warisan (lihat wiki ). Kutipan kecil:implements
akan lebih untuk polimorfisme (lihat wiki ). Kutipan kecil:Jadi, kita dapat memiliki pohon warisan yang sangat berbeda dari kita
class Man
.tetapi jika kami juga menyatakan bahwa kami dapat berpura-pura menjadi tipe yang berbeda -
Person
:.. kemudian kita bisa menggunakannya di mana saja, di mana
Person
diperlukan. Kami hanya harus memenuhi Persons's"interface"
(yaitu menerapkan semua barang publiknya) .implement
kelas lain? Itu hal yang sangat kerenWajah Javascript yang bagus (salah satu manfaat) adalah dukungan bawaan dari pengetikan Duck ( lihat wiki ). Kutipan kecil:
Jadi, dalam Javascript, jika dua objek yang berbeda ... akan memiliki satu metode yang serupa (misalnya
render()
) mereka dapat diteruskan ke fungsi yang mengharapkannya:Untuk tidak kehilangan itu - kita bisa di Typecript melakukan hal yang sama - dengan lebih banyak dukungan yang diketik. Dan disitulah
memiliki perannya sendiri, yang masuk akal
Dalam bahasa OOP sebagai
C#
... tidak ada cara untuk melakukan itu ...Dokumentasi juga akan membantu di sini:
Jadi, sementara
extends
artinya - itu mendapat semua dari induknyaimplements
dalam hal ini hampir seperti mengimplementasikan interface. Objek anak dapat berpura-pura bahwa itu adalah orang tua ... tetapi tidak mendapatkan implementasi apa punsumber
extends
-itu mendapat semua dari induknya", apakah itu berlaku untuk anggota pribadi? Misalnyaclass Person {private name: string} class man extends Person{gender: string;}
apakahman
memiliki nama properti?Dalam skrip ketikan (dan beberapa bahasa OO lainnya) Anda memiliki kelas dan antarmuka.
Sebuah antarmuka tidak memiliki implementasi, itu hanya sebuah "kontrak" dari anggota / metode yang dimiliki tipe ini.
Sebagai contoh:
Contoh yang mengimplementasikan
Point
antarmuka ini harus memiliki dua anggota dengan tipe nomor:x
dany
, dan satu metodedistance
yang menerimaPoint
contoh lain dan mengembalikan anumber
.Antarmuka tidak menerapkan semua itu.
Kelas adalah implementasinya:
( kode di taman bermain )
Dalam contoh Anda, Anda memperlakukan
Person
kelas Anda sekali sebagai kelas saat Anda memperluasnya dan sekali sebagai antarmuka saat Anda mengimplementasikannya.Kode Anda:
Memiliki kesalahan kompilasi yang mengatakan:
Dan itu karena antarmuka kurang implementasi.
Jadi jika Anda
implement
adalah sebuah kelas maka Anda hanya mengambil "kontrak" tanpa implementasi, jadi Anda harus melakukan ini:( kode di taman bermain )
Intinya adalah bahwa dalam banyak kasus Anda ingin ke
extend
kelas lain dan bukan ke kelasimplement
itu.sumber
Jawaban Hebat dari @ nitzan-tomer! Sangat membantu saya ... Saya sedikit memperpanjang demonya dengan:
Dan bagaimana mereka berperilaku dalam fungsi yang mengharapkan sebuah
IPoint
tipe.Jadi apa yang telah saya pelajari sejauh ini dan telah digunakan sebagai aturan umum: Jika Anda menggunakan kelas dan metode yang mengharapkan tipe generik, gunakan antarmuka sebagai tipe yang diharapkan. Dan pastikan orang tua atau kelas dasar menggunakan antarmuka itu. Dengan cara itu Anda dapat menggunakan semua subclass sejauh mereka mengimplementasikan antarmuka.
Berikut demo yang diperpanjang
sumber
extends
fokus pada mewarisi danimplements
fokus pada kendala apakah antarmuka atau kelas.sumber
Memperluas implementasi VS
extends
: Kelas anak (yang diperpanjang) akan mewarisi semua properti dan metode kelas diperpanjangimplements
: Kelas yang menggunakanimplements
kata kunci perlu mengimplementasikan semua properti dan metode kelas yang ituimplements
Sederhananya:
extends
: Di sini Anda mendapatkan semua metode / properti ini dari kelas induk sehingga Anda tidak perlu mengimplementasikannya sendiriimplements
: Ini adalah kontrak yang harus diikuti oleh kelas. Kelas harus mengimplementasikan setidaknya metode / properti berikutContoh:
Dalam contoh kita dapat mengamati bahwa kelas anak mewarisi segalanya dari Person sedangkan kelas man harus mengimplementasikan semuanya dari Person itu sendiri.
Jika kita menghapus sesuatu dari kelas man misalnya metode berjalan kita akan mendapatkan kesalahan waktu kompilasi berikut :
sumber