{"id":229743,"date":"2022-11-23T19:04:00","date_gmt":"2022-11-23T16:04:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229743"},"modified":"2022-11-23T19:19:20","modified_gmt":"2022-11-23T16:19:20","slug":"poluemorfismi-suegavuti-vaatlemine","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/et\/poluemorfismi-suegavuti-vaatlemine\/","title":{"rendered":"Pol\u00fcmorfismi s\u00fcgavuti vaatlemine"},"content":{"rendered":"\n<p>Kui ma seda sarja alustasin, r\u00e4\u00e4kisin objektorienteeritud programmeerimise neljast sambast. K\u00f5ik need teemad on loetletud ja lingitud allpool.<\/p>\n<ol>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/et\/oop-kaks-esimest-sammast\/\" title=\"Abstraktsioon\">Abstraktsioon<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/et\/oop-kaks-esimest-sammast\/\" title=\"Kapseldamine\">Kapseldamine<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/et\/oop-kaks-teist-sammast\/\" title=\"P\u00e4rand\">P\u00e4rand<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/et\/oop-kaks-teist-sammast\/\" title=\"Pol\u00fcmorfism\">Pol\u00fcmorfism<\/a><\/strong><\/li>\n<\/ol>\n<p>Siinkohal tahaksin tavaliselt alustada j\u00e4rgmise teemaga liikumist. Enne seda tahaksin aga veeta veel \u00fche postituse pol\u00fcmorfismi kontseptsiooni uurimiseks.<\/p>\n<p>Oma senise karj\u00e4\u00e4ri jooksul olen n\u00e4inud v\u00e4heseid teemasid, mis tekitavad objektorienteeritud programmeerimisega tegelejatele rohkem segadust ja probleeme kui pol\u00fcmorfism. Seega tahaksin seda objektorienteeritud programmeerimise kontekstis ja v\u00e4ljaspool konkreetset raamistikku v\u00f5i rakendust (nt WordPress) veidi p\u00f5hjalikumalt arutada.<\/p>\n<p>Selles postituses annan kiire \u00fclevaate sellest, mida oleme seni arutanud, ja seej\u00e4rel h\u00fcppan tagasi pol\u00fcmorfismi juurde.<\/p>\n<h2>P\u00f5hjalik pol\u00fcmorfism<\/h2>\n<p>Esiteks, nagu mainitud, tahan kiiresti \u00fcle vaadata, mida seni on arutatud, eriti kui olete m\u00f5ne eelneva postituse varju j\u00e4tnud.<\/p>\n<p>\u00c4rge muretsege: miski allpool ei muutu koodiks. Selle asemel m\u00e4\u00e4ratleb see lihtsalt terminid, mida oleme kasutanud, nii et teil oleks aimu, millele ma viitan, kui n\u00e4ete selle seeria jooksul seda s\u00f5na.<\/p>\n<h3>Abstraktsioon<\/h3>\n<blockquote>\n<p>Abstraheerime idee millestki klassi. Selle asemel abstraheerime ideid nende klassidesse. Ja siin on p\u00f5hiidee: klass peaks esindama nimis\u00f5na.<\/p>\n<\/blockquote>\n<h3>Kapseldamine<\/h3>\n<blockquote>\n<p>Kapseldamine on tegelikult lihtsalt &quot;suur&quot; s\u00f5na, mis viitab ideele oma kohustuste haldamisest (v\u00f5i andmete j\u00e4lgimisest).<\/p>\n<\/blockquote>\n<h3>P\u00e4rand<\/h3>\n<blockquote>\n<p>P\u00e4rimine viitab ideele, et \u00fchel klassil, kuigi sellel on oma teostus, p\u00e4rib see s\u00f5na otseses m\u00f5ttes \u00fclemklassi omadused, funktsioonid ja \u00fcldise teostuse.<\/p>\n<\/blockquote>\n<h3>Pol\u00fcmorfism<\/h3>\n<blockquote>\n<p>Pol\u00fcmorfism v\u00f5imaldab meil viidata \u00fche t\u00fc\u00fcbi klassile, kui seda v\u00f5idakse deklareerida teise t\u00fc\u00fcbina.<\/p>\n<\/blockquote>\n<p>Sellega seoses arvan, et siin v\u00f5ivad asjad veidi keerulisemaks minna. Eelmistes postitustes olen pakkunud mitmeid erinevaid koodin\u00e4iteid (ja soovitan tungivalt neile tagasi vaadata).<\/p>\n<p>Kuid t\u00e4nases postituses proovin seda ideed veidi l\u00e4hemalt uurida nii selgituses kui ka koodis.<\/p>\n<h2>Seoses p\u00e4randiga<\/h2>\n<p>Kui see pole sel hetkel ilmne, on pol\u00fcmorfism tugevalt seotud p\u00e4rimisega. M\u00f5elge sellele j\u00e4rgmiselt: kui \u00fcks klass p\u00e4rib atribuudid ja meetodid teiselt klassilt, v\u00f5ib see \u00fclemklassi &quot;paigal seista&quot;.<\/p>\n<p>See t\u00e4hendab, et kui teil on midagi nagu sisuklass ja teil on kaks alamklassi, millest \u00fcks on <strong>postitus<\/strong> ja teine \u200b\u200bon <strong>leht<\/strong>, saate klassi eksemplari luua, kasutades <strong>sisu<\/strong> <strong>viitet\u00fc\u00fcpi.t<\/strong><\/p>\n<p>Kuid k\u00e4itusajal on see tegelikult <strong>Postitus<\/strong> t\u00fc\u00fcpi eksemplar. On loogiline? Siin on n\u00e4itena m\u00f5ni kood.<\/p>\n<p>Esiteks alustame sisuklassi <a href=\"https:\/\/gist.github.com\/tommcfarlin\/cd3e2afb65810ed9cf423ad7c8f8e532#file-00-content-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">m\u00e4\u00e4ratlemisega<\/a> :<\/p>\n<pre><code>&lt;?php\nclass Content {\n\n   protected $title;\n\n   protected $content;\n\n   protected $metadata;\n\n   public function __construct()\n   {\n     $this-&gt;title = \"Hello World!\";\n     $this-&gt;content = \"This is a sample piece of content.\";\n     $this-&gt;metadata = \"&lt;This is the metadata of the post.&gt;\";\n   }\n\n   public function getTitle()\n   {\n     return $this-&gt;title;\n   }\n\n   public function getContent()\n   {\n     return $this-&gt;content;\n   }\n\n   public function getMetadata()\n   {\n     return $this-&gt;metadata;\n   }\n }\n<\/code><\/pre>\n<p>Sellel on \u00fcldised omadused, mida olete t\u00f5en\u00e4oliselt oodanud \u2013 pealkiri, sisu ja metaandmed. T\u00f5si, need atribuudid on vaid stringid, kuid reaalses olukorras v\u00f5ivad need olla keerukamad andmestruktuurid.<\/p>\n<p>Vaatame n\u00fc\u00fcd <strong>postitust<\/strong> :<\/p>\n<pre><code>&lt;?php\n\nclass Post extends Content  {\n\n   private $author;\n\n   public function __construct() {\n     parent::__construct();\n     $this-&gt;author = \"Tom McFarlin\";\n   }\n\n   public function getAuthor()\n   {\n     return $this-&gt;author;\n   }\n }\n<\/code><\/pre>\n<p>Mis juhtub siis, kui kutsute v\u00e4lja meetodi <strong>Post<\/strong> &#8211; klassis, nagu <strong>getTitle<\/strong>, mida pole olemas, kuid\u00a0 klassis <strong>sisu<\/strong> on see olemas? Seej\u00e4rel otsib see p\u00e4rimise t\u00f5ttu meetodit jaotisest <strong>Postitus<\/strong>, mitte ei leia seda, ja hakkab seej\u00e4rel\u00a0 otsima seda jaotisest <strong>Sisu<\/strong>.<\/p>\n<p>Kui see leitakse, k\u00e4ivitab see selle.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-164720-61e76b6c3e3d0.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-164720-61e76b6c3e3d0.png\" alt=\"Pol\u00fcmorfismi s\u00fcgavuti vaatlemine\"><\/a><\/p>\n<p>Samamoodi saame midagi sellist teha <a href=\"https:\/\/gist.github.com\/tommcfarlin\/cd3e2afb65810ed9cf423ad7c8f8e532#file-02-page-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">lehe<\/a> klassi ja sisu andmetega. Esiteks loome baasklassi ja seej\u00e4rel m\u00e4\u00e4rame <strong>lehele<\/strong> spetsiifilised atribuudid. Sel juhul on see kategooria.<\/p>\n<pre><code>&lt;?php\n\nclass Page extends Content  {\n\n   private $category;\n\n   public function __construct() {\n     parent::__construct();\n     $this-&gt;category = \"Articles\";\n   }\n\n   public function getCategory()\n   {\n     return $this-&gt;category;\n   }\n }\n<\/code><\/pre>\n<p>N\u00fc\u00fcd, kui me koodi k\u00e4ivitame, saame alustada <strong>sisuga:<\/strong><\/p>\n<pre><code>&lt;?php\n\n$content = new Content();\necho $content-&gt;getTitle();<\/code><\/pre>\n<p>Pange t\u00e4hele, et see tundub ootusp\u00e4rane, kuna meil on pealkiri ja meil on sisu. Vaatame ka <strong>postitust<\/strong> :<\/p>\n<pre><code>&lt;?php\n\n\/\/ These will work because they reside in the Content base class.\n$post = new Post();\necho $post-&gt;getAuthor();\necho $post-&gt;getTitle();<\/code><\/pre>\n<p>See toimib, kuna meil on autor, kuid meil on ka pealkiri, kuna see asub <strong>sisus<\/strong>. Aga kui me proovime Post eksemplaril kutsuda <strong>getAuthor<\/strong><strong>?<\/strong><\/p>\n<pre><code>&lt;?php\n\n\/\/ These will work because they reside in the Content base class.\n$post = new Post();\necho $post-&gt;getAuthor();\necho $post-&gt;getTitle();<\/code><\/pre>\n<p>Saame veateate, kuna meetod ei asu selles klassis.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-164720-61e76b6f7949a.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-164720-61e76b6f7949a.png\" alt=\"Pol\u00fcmorfismi s\u00fcgavuti vaatlemine\"><\/a><\/p>\n<p>Mida me siis tegema peame? Kuna meil pole PHP-s tugevaid t\u00fc\u00fcpe, ei saa me seda teisele t\u00fc\u00fcbile \u00fcle kanda.<\/p>\n<p>Selle jaoks on olemas kujundusmustrid, millest r\u00e4\u00e4gin j\u00e4rgmistes postitustes, kuid PHP ei v\u00f5imalda seda nii lihtsalt kui m\u00f5ned teised keeled (nt C# v\u00f5i Java).<\/p>\n<h2>K\u00fcsimused pol\u00fcmorfismi kohta<\/h2>\n<p>Loodetavasti annab \u00fclaltoodud kood teile aimu, kuidas konkreetsel t\u00fc\u00fcbil, n\u00e4iteks <strong>postitusel\u00a0<\/strong> v\u00f5i <strong>lehek\u00fcljel<\/strong>, v\u00f5ivad kaudselt olla k\u00e4itusajal kasutatavad p\u00f5hiklassi <strong>Sisu omadused ja meetodid.<\/strong><\/p>\n<p>Kuid see tekitab ka paar k\u00fcsimust, kas pole? N\u00e4iteks:<\/p>\n<ul>\n<li><strong>Miks on pol\u00fcmorfism kasulik?<\/strong> L\u00f5ppkokkuv\u00f5ttes on see paindlikkuse k\u00fcsimus. See t\u00e4hendab, et saate kirjutada \u00fcldise <strong>sisut\u00fc\u00fcbi<\/strong>, kuid seej\u00e4rel luua <strong>postituse<\/strong> v\u00f5i <strong>lehe<\/strong>, nagu eespool n\u00e4gime. See annab meile k\u00f5ik sisuklassi eelised, <strong>andes<\/strong> meile ka n\u00e4iteks klassi <strong>Post spetsiifilisuse.<\/strong><\/li>\n<li><strong>See n\u00e4ib olevat rohkem segadust tekitav kui paindlik.<\/strong> M\u00f5nes m\u00f5ttes on see segane, sest kood n\u00f5uab natuke j\u00e4lgimist. See t\u00e4hendab, et v\u00f5ite alustada\u00a0 klassist <strong>Postitus<\/strong> ja vaadata, mida <strong>sisuklass<\/strong> pakub. Teisest k\u00fcljest muudab see v\u00e4ga lihtsaks uue <strong>sisu<\/strong> alamklassi tutvustamise ja selle kasutamise siis, kui see k\u00e4itusajal k\u00f5ige paremini sobib.<\/li>\n<\/ul>\n<p>Mis puutub \u00fclem- ja alamklassidesse, siis siin tuleb m\u00e4ngu kindla IDE olemasolu.<\/p>\n<p>Alati on tore, kui teil on redaktor, mis teile meeldib, kuid kui teil on redaktor, mis suudab intuitiivselt kindlaks teha, mis on p\u00f5hiklass, mis on p\u00f5hiklass jne, v\u00f5ib see aidata j\u00e4lgida, siluda, j\u00e4lgida ja uusi kirjutada. kood.<\/p>\n<p>Kuid see on teise postituse sisu, mis tuleb p\u00e4rast seda, kui r\u00e4\u00e4gime disainimustritest.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Vaatame pol\u00fcmorfismi p\u00f5hjalikult, et saada selgem ettekujutus selle toimimisest ja selle kasulikkusest.<\/p>\n","protected":false},"author":1,"featured_media":223973,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[718,894,842,802],"tags":[1165],"class_list":["post-229743","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-arendaja","category-kood","category-opetused","category-php-4","tag-affiai-et"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/posts\/229743","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/comments?post=229743"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/posts\/229743\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/media\/223973"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/media?parent=229743"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/categories?post=229743"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/tags?post=229743"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}