JavaRush /Blog Jawa /Random-JV /Warisan minangka fenomena
articles
tingkat

Warisan minangka fenomena

Diterbitake ing grup
Kanggo ngandhani sing bener, aku ora ngrancang artikel iki. Perkara-perkara sing arep dakrembug ing kene dakanggep sepele, malah ora pantes dicritakake. Nanging, ing proses nulis artikel kanggo situs iki, aku ngangkat diskusi babagan pirang-pirang warisan ing salah sawijining forum. Akibaté, ternyata umume pangembang duwe pangerten sing ora jelas babagan warisan. Lan, miturut, dheweke nggawe akeh kesalahan. Wiwit warisan minangka salah sawijining fitur OOP sing paling penting (yen ora sing paling penting!), Aku mutusake kanggo nyedhiyakake artikel sing kapisah kanggo fenomena iki. * * * Kaping pisanan, aku pengin mbedakake antarane rong konsep - obyek lan kelas. Konsep-konsep iki terus-terusan bingung. Kangge, dheweke dadi pusat OOP. Lan, ing mratelakake panemume, iku perlu kanggo ngerti beda antarane wong-wong mau. Dadi, obyek. Sejatine, iku apa wae. Punika kubus. Kayu, biru. Dawane pinggiran 5 cm Iki minangka obyek. Lan ana piramida. Plastik, abang. 10 cm iga. Iki uga obyek. Apa padha duwe ing umum? ukuran sing beda-beda. wangun beda. Materi sing beda. Nanging, padha duwe sing padha. Kaping pisanan, loro kubus lan piramida iku polyhedra biasa. Sing. gunggunge wilangan vertex lan wilangan rai 2 luwih akeh tinimbang jumlah pinggiran. Salajengipun. Loro-lorone wangun duwe pasuryan, pinggiran lan vertex. Loro-lorone tokoh kasebut nduweni karakteristik kaya ukuran iga. Loro-lorone wangun bisa diputer. Loro tokoh bisa digambar. Loro sifat pungkasan wis prilaku. Lan sateruse. Praktek pemrograman nuduhake yen luwih gampang operate karo obyek homogen tinimbang karo obyek heterogen. Lan amarga isih ana sing umum ing antarane tokoh kasebut, ana kepinginan kanggo nyorot kesamaan iki. Iki ngendi konsep kelas teka menyang muter. Dadi, definisi.
Kelas minangka deskriptor sifat umum saka klompok obyek. Properti kasebut bisa dadi karakteristik obyek (ukuran, bobot, warna, lsp), lan prilaku, peran, lsp.
Komentar. Tembung "kabeh" (deskriptor kabeh sifat) ora diucapake. Tegese obyek apa wae bisa kalebu sawetara kelas sing beda. Warisan minangka fenomena - 1 Ayo njupuk conto sing padha karo wangun geometris minangka basis. Katrangan sing paling umum yaiku polyhedron biasa . Preduli saka ukuran pinggiran, nomer pasuryan lan vertex. Ing bab mung kita ngerti iku tokoh iki wis vertex, pinggiran lan pasuryan, lan sing dawa saka sudhut padha. Salajengipun. Kita bisa nggawe katrangan luwih spesifik. Ayo kita nggambar polyhedron iki . Ayo kita ngenalake konsep kasebut minangka polyhedron biasa sing digambar . Apa sing kita butuhake kanggo nggambar? Katrangan cara gambar umum sing ora gumantung ing koordinat vertex tartamtu. Mungkin warna obyek kasebut. Saiki ayo ngenalake kelas Kubus lan Tetrahedron . Obyek sing ana ing kelas kasebut mesthi polyhedra biasa. Bentenipun mung nomer vertex, pinggiran lan pasuryan wis strictly tetep kanggo saben kelas anyar. Luwih, ngerti jinis tokoh tartamtu, kita bisa menehi gambaran saka cara drawing. Iki tegese sembarang obyek saka kelas Kubus utawa Tetrahedron uga obyek saka kelas polyhedron biasa digambar . Ana hierarki kelas. Ing hirarki iki, kita mudhun saka deskripsi sing paling umum menyang sing paling spesifik. Elinga yen obyek saka kelas apa wae uga cocog karo deskripsi kelas sing luwih umum ing hierarki. Hubungan kelas iki diarani warisan . Saben kelas anak marisi kabeh properti saka wong tuwa, luwih umum, lan (bisa uga) nambah sawetara properti kasebut dhewe. Utawa overrides sawetara sifat saka kelas induk. Ing kene aku pengin ngutip saka buku klasik Gradi Bucha babagan desain berorientasi obyek:
Warisan, mulane, nemtokake hirarki "yaiku" ing antarane kelas, ing ngendi subclass diwenehi warisan saka siji utawa luwih superclass. Iki nyatane tes lakmus kanggo warisan. Diwenehi kelas A lan B, yen A "dudu" jenis B, banjur A ora kudu subclass saka B.
Diterjemahake kaya mangkene:
Warisan kanthi mangkono nemtokake hirarki "iku" ing antarane kelas, ing ngendi subclass diwenehi warisan saka siji utawa luwih superclass. Iki, nyatane, tes sing nemtokake (secara harfiah, tes lakmus, cathetanku) kanggo warisan. Yen kita duwe kelas A lan B, lan yen kelas A "dudu" varian saka kelas B, mula A kudu ora dadi subkelas B.
Sing wis maca adoh iki mbokmenawa bakal twirt driji ing kuil ing bewildered. Pikiran pisanan yaiku iki ora pati penting! Iki bener. Nanging yen sampeyan ngerti carane akeh hierarki warisan edan aku wis weruh! Ing dhiskusi sing dakkandhakake ing wiwitan, salah sawijining peserta cukup serius marisi tank saka ... senapan mesin !!! Kanggo alesan prasaja sing tank wis senapan mesin. Lan iki minangka kesalahan sing paling umum. Warisan bingung karo agregasi - kalebu siji obyek ing liyane. Tank dudu senapan mesin, isine siji. Lan amarga kesalahan iki, paling asring ana kepinginan kanggo nggunakake macem-macem warisan. Ayo saiki langsung pindhah menyang Jawa. Apa sing ana ing babagan warisan? Ana rong jinis kelas ing basa - sing bisa ngemot implementasi, lan sing ora bisa nindakake. Sing terakhir diarani antarmuka, sanajan sejatine minangka kelas abstrak. Warisan minangka fenomena - 2 Dadi, basa kasebut ngidini sampeyan entuk warisan kelas saka kelas liyane sing duweni potensi ngemot implementasine. Nanging mung saka siji! Ayo kula nerangake apa iki rampung. Intine yaiku saben implementasine mung bisa ngatasi bagean - karo variabel lan metode sing dingerteni. Lan sanajan kita olèh warisan kelas C saka A lan B , banjur cara processA , dipun warisaken saka kelas A, mung bisa karo variabel internal a , amarga ora ngerti apa-apa bab b , kaya ora ngerti apa-apa bab c lan cara processC . Semono uga metode processB mung bisa karo variabel b. Tegese, perangan sing diwarisake diisolasi. Kelas C mesthi bisa digunakake karo wong-wong mau, nanging bisa uga bisa digunakake karo bagean kasebut yen mung dilebokake minangka bagean tinimbang diwarisake. Nanging, ana gangguan liyane ing kene, yaiku tumpang tindih jeneng. Yen metode processA lan processB padha dijenengi, ngomong proses, banjur apa efek nelpon cara proses kelas C duwe ? Kang saka rong cara bakal disebut? Mesthi, C ++ duwe kontrol ing kahanan iki, nanging iki ora nambah harmoni ing basa. Dadi, warisan implementasine ora menehi kaluwihan, nanging ana kekurangan. Awit saking menika, warisan implementasi wonten ing Jawi menika dipuntilar. Nanging, pangembang ditinggalake kanthi pilihan kanggo macem-macem warisan minangka warisan saka antarmuka. Ing istilah Jawa, implementasi antarmuka. Apa antarmuka? Sakumpulan cara. (Saiki kita ora nimbang definisi konstanta ing antarmuka; liyane babagan kene .) Apa cara? Lan cara, ing inti, nemtokake prilaku obyek. Ora kebeneran yen jeneng meh kabeh metode ngemot tumindak - getXXX , drawXXX , countXXX , lsp. Lan amarga antarmuka minangka koleksi metode, antarmuka kasebut , nyatane, minangka penentu prilaku . Pilihan liyane kanggo nggunakake antarmuka yaiku kanggo nemtokake peran obyek. Observer, Listener , etc. Ing kasus iki, cara iku bener pawujudan saka reaksi kanggo sawetara acara external. Sing, maneh, prilaku. Sawijining obyek bisa uga duwe sawetara prilaku sing beda. Yen perlu kanggo menehi, iku render. Yen dheweke kudu disimpen, dheweke bakal disimpen. Inggih, lsp. Mulane, kemampuan kanggo warisan saka kelas sing nemtokake prilaku banget, banget migunani. Kajaba iku, obyek bisa duwe sawetara peran beda. Nanging, implementasineprilaku tanggung ing kalbu kelas anak. Warisan saka antarmuka (implementasine) ngandika sing obyek saka kelas iki kudu bisa nindakake iki lan sing. Lan CARA nindakake iki ditemtokake independen dening saben kelas ngleksanakake antarmuka. Ayo bali menyang kesalahan ing warisan. Pengalaman saya ngembangake macem-macem sistem nuduhake yen duwe warisan saka antarmuka, sampeyan bisa ngetrapake sistem apa wae tanpa nggunakake warisan implementasine. Mulane, nalika aku nemokke keluhan bab lack saka macem-macem warisan ing wangun kang ana ing C ++, kanggo kula iki tandha manawa desain salah. Kesalahan sing paling umum yaiku sing wis dakcritakake - warisan bingung karo agregasi. Kadhangkala kedadeyan kasebut amarga asumsi sing salah. Sing. Contone, spedometer, didebatake manawa kacepetan mung bisa diukur kanthi ngukur jarak lan wektu, sawise spedometer kasebut kasil diwarisake saka panguasa lan jam, saengga dadi panguwasa lan jam, miturut definisi. pusaka. (Panjalukku kanggo ngukur wektu nganggo spedometer biasane dijawab karo guyon. Utawa ora dijawab babar pisan.) Apa kesalahan ing kene? Ing premis. Kasunyatane spedometer ora ngukur wektu. Lan jarak, kanthi cara, uga. Odometer, sing ditemokake ing spedometer apa wae, minangka conto klasik saka piranti liya ing omah sing padha, yaiku. nglumpukake. Ora perlu kanggo ngukur kacepetan. Bisa dicopot kabeh - iki ora bakal mengaruhi pangukuran kacepetan kanthi cara apa wae. Kadhangkala kesalahan kasebut ditindakake kanthi sengaja. Iki luwih elek. "Ya, aku ngerti iki salah, nanging luwih trep kanggoku." Iki bisa nyebabake apa? Nanging iki: kita bakal oleh warisan tank saka meriam lan bedhil mesin. Luwih trep cara iki. Akibaté, tank dadi meriam lan bedhil mesin. Sabanjure kita bakal nglengkapi pesawat karo rong bedhil mesin lan meriam. Apa sing kita entuk? Pesawat kanthi gaman sing digantung ing bentuk telung tank! Amarga ana wong sing, tanpa ngerti, nggunakake tank minangka bedhil mesin. Eksklusif miturut hirarki warisan. Lan dheweke bakal bener, amarga sing ngrancang hierarki kasebut nggawe kesalahan.
Umumé, aku ora ngerti pendekatan " luwih trep kanggo aku kanthi cara iki". Iku trep kanggo nulis kaya pamireng, lan sing ngomong grammar dhasar kazly. Aku exaggerating, mesthi, nanging idea utama tetep - saliyane penak sedhela, ana bab kayata kesusastraan. Konsep iki ditetepake adhedhasar pengalaman wong sing akeh banget. Nyatane, iki ing basa Inggris diarani "praktik paling apik" - solusi sing paling apik. Lan luwih kerep tinimbang ora, solusi sing katon luwih gampang nggawa akeh masalah ing mangsa ngarep.
Conto iki, mesthi, banget exaggerated lan mulane absurd. Nanging, ana kasus-kasus sing kurang jelas sing bisa nyebabake akibat bencana. Kanthi warisan saka obyek, tinimbang nglumpukake, pangembang menehi sapa wae kemampuan kanggo nggunakake fungsi obyek induk kasebut kanthi langsung. Kanthi kabeh sing tegese. Mbayangno yen sampeyan duwe kelas sing bisa digunakake karo database, DBManager . Sampeyan nggawe kelas liyane sing bakal bisa digunakake karo data sampeyan nggunakake DBManager - DataManager . Kelas iki bakal nindakake kontrol data, transformasi, tumindak tambahan, lsp. Umumé, lapisan antarane lapisan bisnis lan lapisan dhasar. Yen sampeyan marisi DataManager saka DBManager, sapa wae sing nggunakake bakal duwe akses menyang database langsung. Lan, mulane, dheweke bakal bisa nindakake tumindak apa wae sing ngliwati kontrol, transformasi, lan liya-liyane. Nanging! Ayo nganggep yen basis wis diganti. Maksudku, sawetara prinsip kontrol utawa transformasi wis diganti. DataManager wis diganti. Nanging kode sing sadurunge bisa langsung karo database bakal terus bisa. Dheweke bakal paling ora ngelingi dheweke. Asilé bakal dadi kesalahan saka kelas kasebut sing bakal dadi abu-abu sing nggoleki. Ora bakal kelakon kanggo sapa wae sing nggarap database sing ngliwati DataManager. Miturut cara, conto saka urip nyata. Butuh wektu VERY dawa kanggo nemokake kesalahan. Akhire, aku bakal ngomong maneh. Warisan mung kudu digunakake nalika ana hubungan "iku". Amarga iki minangka inti saka warisan - kemampuan kanggo nggunakake obyek saka kelas anak minangka obyek saka kelas dhasar. Yen ora ana hubungan "yaiku" antarane kelas, ORA ana warisan !!! Ora tau lan ing kahanan apa wae. Lan malah luwih - mung amarga trep banget. Pranala menyang sumber asli: http://www.skipy.ru/philosophy/inheritance.html
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION