{"id":230310,"date":"2022-11-23T19:41:00","date_gmt":"2022-11-23T16:41:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230310"},"modified":"2022-11-23T19:54:47","modified_gmt":"2022-11-23T16:54:47","slug":"tarkastellaan-polymorfismia-syvaellisesti","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fi\/tarkastellaan-polymorfismia-syvaellisesti\/","title":{"rendered":"Tarkastellaan polymorfismia syv\u00e4llisesti"},"content":{"rendered":"\n<p>Kun aloitin t\u00e4m\u00e4n sarjan, puhuin olio-ohjelmoinnin nelj\u00e4st\u00e4 pilarista. Jokainen n\u00e4ist\u00e4 aiheista on lueteltu ja linkitetty alla.<\/p>\n<ol>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/fi\/oop-n-kaksi-ensimmaeistae-pilaria\/\" title=\"Abstraktio\">Abstraktio<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/fi\/oop-n-kaksi-ensimmaeistae-pilaria\/\" title=\"Kapselointi\">Kapselointi<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/fi\/oop-n-kaksi-toista-pilaria\/\" title=\"Perint\u00f6\">Perint\u00f6<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/fi\/oop-n-kaksi-toista-pilaria\/\" title=\"Polymorfismi\">Polymorfismi<\/a><\/strong><\/li>\n<\/ol>\n<p>T\u00e4ss\u00e4 vaiheessa haluaisin yleens\u00e4 siirty\u00e4 seuraavaan aiheeseen. Ennen kuin teen niin, haluaisin kuitenkin viett\u00e4\u00e4 viel\u00e4 yhden postauksen polymorfismin k\u00e4sitteen tutkimiseen.<\/p>\n<p>T\u00e4h\u00e4n menness\u00e4 urallani olen n\u00e4hnyt harvojen aiheiden antavan olio-ohjelmointiin perehtyville enemm\u00e4n h\u00e4mmennyst\u00e4 ja ongelmia kuin polymorfismi. Joten haluaisin keskustella siit\u00e4 hieman syv\u00e4llisemmin olioohjelmoinnin yhteydess\u00e4 ja mink\u00e4 tahansa tietyn kehyksen tai sovelluksen (kuten WordPressin) ulkopuolella.<\/p>\n<p>T\u00e4ss\u00e4 viestiss\u00e4 teen nopean katsauksen siihen, mit\u00e4 olemme keskustelleet t\u00e4h\u00e4n menness\u00e4, ja hypp\u00e4\u00e4n sitten takaisin polymorfismiin.<\/p>\n<h2>Polymorfismi perusteellisesti<\/h2>\n<p>Ensinn\u00e4kin, kuten mainittiin, haluan nopeasti k\u00e4yd\u00e4 l\u00e4pi, mit\u00e4 t\u00e4h\u00e4n menness\u00e4 on keskusteltu, varsinkin jos olet peitellyt mit\u00e4\u00e4n aiemmista viesteist\u00e4.<\/p>\n<p>\u00c4l\u00e4 huoli: mik\u00e4\u00e4n alla olevasta ei muutu koodiksi. Sen sijaan se yksinkertaisesti m\u00e4\u00e4rittelee k\u00e4ytt\u00e4m\u00e4mme termit, jotta sinulla on jonkinlainen k\u00e4sitys siit\u00e4, mihin viittaan, kun n\u00e4et sanan esiintyv\u00e4n t\u00e4ss\u00e4 sarjassa.<\/p>\n<h3>Abstraktio<\/h3>\n<blockquote>\n<p>Abstraktoimme idean jostakin luokaksi. Sen sijaan aiomme ottaa ideoita heid\u00e4n luokkiinsa. Ja t\u00e4ss\u00e4 on keskeinen ajatus: Luokan tulee edustaa substantiivia.<\/p>\n<\/blockquote>\n<h3>Kapselointi<\/h3>\n<blockquote>\n<p>Kapselointi on oikeastaan \u200b\u200bvain &quot;iso&quot; sana, joka viittaa ajatukseen vastuunsa hallinnasta (tai tietojensa seuraamisesta).<\/p>\n<\/blockquote>\n<h3>Perint\u00f6<\/h3>\n<blockquote>\n<p>Perinn\u00f6ll\u00e4 tarkoitetaan ajatusta, ett\u00e4 yksi luokka, vaikka sill\u00e4 on oma toteutus, kirjaimellisesti perii ominaisuudet, funktiot ja yleisen toteutuksen emoluokalta.<\/p>\n<\/blockquote>\n<h3>Polymorfismi<\/h3>\n<blockquote>\n<p>Polymorfismin avulla voimme viitata yhden tyypin luokkaan, kun se voidaan julistaa toiseksi tyypiksi.<\/p>\n<\/blockquote>\n<p>N\u00e4in sanottuna mielest\u00e4ni asiat voivat olla hieman monimutkaisempia. Aiemmissa viesteiss\u00e4 olen antanut useita erilaisia \u200b\u200bkoodiesimerkkej\u00e4 (ja kehotan sinua katsomaan niit\u00e4 taaksep\u00e4in).<\/p>\n<p>Mutta t\u00e4m\u00e4np\u00e4iv\u00e4isess\u00e4 viestiss\u00e4 yrit\u00e4n tutkia ideaa hieman tarkemmin sek\u00e4 selityksess\u00e4 ett\u00e4 koodissa.<\/p>\n<h2>Perinn\u00f6n suhteen<\/h2>\n<p>Jos se ei ole ilmeist\u00e4 t\u00e4ss\u00e4 vaiheessa, polymorfismi liittyy vahvasti periytymiseen. Ajattele asiaa n\u00e4in: Jos yksi luokka perii ominaisuudet ja menetelm\u00e4t toiselta luokalta, se voi &quot;seist\u00e4 paikallaan&quot; emoluokan.<\/p>\n<p>T\u00e4m\u00e4 tarkoittaa, ett\u00e4 jos sinulla on jokin <strong>sis\u00e4lt\u00f6luokka<\/strong> ja sitten kaksi alaluokkaa, joista toinen on <strong>viesti<\/strong> ja toinen <strong>sivu<\/strong>, voit luoda luokan k\u00e4ytt\u00e4m\u00e4ll\u00e4 <strong>Sis\u00e4lt\u00f6viittaustyyppi.t<\/strong><\/p>\n<p>Mutta ajon aikana se on itse asiassa <strong>Post<\/strong> &#8211; tyyppinen esiintym\u00e4. K\u00e4yd\u00e4 j\u00e4rkeen? T\u00e4ss\u00e4 esimerkkin\u00e4 koodia.<\/p>\n<p>Aluksi aloitamme <a href=\"https:\/\/gist.github.com\/tommcfarlin\/cd3e2afb65810ed9cf423ad7c8f8e532#file-00-content-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">sis\u00e4lt\u00f6luokan<\/a> m\u00e4\u00e4ritt\u00e4misell\u00e4 :<\/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>Siin\u00e4 on yleiset ominaisuudet, joita olet todenn\u00e4k\u00f6isesti tottunut odottamaan \u2013 otsikko, sis\u00e4lt\u00f6 ja metatiedot. My\u00f6nnett\u00e4k\u00f6\u00f6n, ett\u00e4 n\u00e4m\u00e4 ominaisuudet ovat vain merkkijonoja, mutta ne voivat olla yksityiskohtaisempia tietorakenteita todellisessa tilanteessa.<\/p>\n<p>Katsotaanpa nyt <strong>postausta<\/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>Mit\u00e4 sitten tapahtuu, jos kutsut menetelm\u00e4\u00e4 <strong>Post<\/strong> &#8211; luokassa, kuten <strong>getTitle<\/strong>, jota ei ole olemassa, mutta se on olemassa <strong>Content<\/strong> &#8211; luokassa? Sitten perinn\u00f6llisyyden vuoksi se etsii menetelm\u00e4\u00e4 <strong>Viestist\u00e4<\/strong>, ei l\u00f6yd\u00e4 sit\u00e4, ja alkaa sitten etsi\u00e4 sit\u00e4 <strong>Sis\u00e4lt\u00f6st\u00e4<\/strong>.<\/p>\n<p>Jos se l\u00f6ytyy, se ajaa sen.<\/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=\"Tarkastellaan polymorfismia syv\u00e4llisesti\"><\/a><\/p>\n<p>Vastaavasti voimme tehd\u00e4 jotain t\u00e4m\u00e4n kaltaista <a href=\"https:\/\/gist.github.com\/tommcfarlin\/cd3e2afb65810ed9cf423ad7c8f8e532#file-02-page-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">sivuluokka-<\/a> ja sis\u00e4lt\u00f6tiedoilla. Ensin instantoimme perusluokan ja asetamme sitten <strong>sivulle<\/strong> ominaiset ominaisuudet. T\u00e4ss\u00e4 tapauksessa se tulee olemaan luokka.<\/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>Nyt kun suoritamme koodin, voimme aloittaa <strong>sis\u00e4ll\u00f6st\u00e4:<\/strong><\/p>\n<pre><code>&lt;?php\n\n$content = new Content();\necho $content-&gt;getTitle();<\/code><\/pre>\n<p>Huomaa, ett\u00e4 t\u00e4m\u00e4 n\u00e4ytt\u00e4\u00e4 silt\u00e4, \u200b\u200bmit\u00e4 odotimme, koska meill\u00e4 on otsikko ja meill\u00e4 on sis\u00e4lt\u00f6\u00e4. Katsotaanpa my\u00f6s <strong>viesti\u00e4<\/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>T\u00e4m\u00e4 toimii, koska meill\u00e4 on kirjoittaja, mutta meill\u00e4 on my\u00f6s otsikko, koska se sijaitsee <strong>Sis\u00e4lt\u00f6ss\u00e4<\/strong>. Mutta jos yrit\u00e4mme kutsua <strong>getAuthoria<\/strong> Post -instanssissa<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>Saamme virheilmoituksen, koska menetelm\u00e4 ei ole kyseisess\u00e4 luokassa.<\/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=\"Tarkastellaan polymorfismia syv\u00e4llisesti\"><\/a><\/p>\n<p>Mit\u00e4 meid\u00e4n pit\u00e4\u00e4 tehd\u00e4? Koska meill\u00e4 ei ole vahvoja tyyppej\u00e4 PHP:ss\u00e4, emme voi l\u00e4hett\u00e4\u00e4 sit\u00e4 eri tyyppiin.<\/p>\n<p>T\u00e4t\u00e4 varten on olemassa suunnittelumalleja, joista aion keskustella tulevissa postauksissa, mutta PHP ei salli t\u00e4t\u00e4 yht\u00e4 helposti kuin jotkut muut kielet (kuten C# tai Java).<\/p>\n<h2>Kysymyksi\u00e4 polymorfismista<\/h2>\n<p>Toivottavasti yll\u00e4 oleva koodi antaa sinulle k\u00e4sityksen siit\u00e4, kuinka tietyll\u00e4 konkreettisella tyypill\u00e4, kuten <strong>viestill\u00e4\u00a0<\/strong> tai <strong>sivulla<\/strong>, voi implisiittisesti olla ajon aikana k\u00e4ytett\u00e4v\u00e4n perusluokkansa <strong>Content<\/strong> ominaisuudet ja menetelm\u00e4t\u00a0 .<\/p>\n<p>Mutta se her\u00e4tt\u00e4\u00e4 my\u00f6s muutamia kysymyksi\u00e4, eik\u00f6 niin? Esimerkiksi:<\/p>\n<ul>\n<li><strong>Miksi polymorfismi on hy\u00f6dyllist\u00e4?<\/strong> Viime k\u00e4dess\u00e4 kyse on joustavuudesta. Toisin sanoen voit kirjoittaa yleisen <strong>sis\u00e4lt\u00f6tyypin<\/strong>, mutta luoda sitten <strong>viestin<\/strong> tai <strong>sivun<\/strong>, kuten edell\u00e4 on n\u00e4hty. <strong>T\u00e4m\u00e4 antaa meille sitten kaikki Sis\u00e4lt\u00f6<\/strong> &#8211; luokan edut ja\u00a0 antaa meille my\u00f6s esimerkiksi <strong>Post<\/strong> &#8211; luokan erityispiirteen.<\/li>\n<li><strong>T\u00e4m\u00e4 n\u00e4ytt\u00e4\u00e4 olevan enemm\u00e4n h\u00e4mment\u00e4v\u00e4 kuin joustava.<\/strong> Se on tavallaan h\u00e4mment\u00e4v\u00e4\u00e4, koska koodi vaatii hieman j\u00e4ljityst\u00e4. Toisin sanoen saatat aloittaa <strong>Post<\/strong> &#8211; luokasta ja joutua katsomaan, mit\u00e4 <strong>Sis\u00e4lt\u00f6<\/strong> &#8211; luokka tarjoaa. Toisaalta sen avulla on todella helppoa ottaa k\u00e4ytt\u00f6\u00f6n uusi <strong>Sis\u00e4lt\u00f6<\/strong> -alaluokka ja sitten k\u00e4ytt\u00e4\u00e4 sit\u00e4 silloin, kun se sopii parhaiten suoritusaikana.<\/li>\n<\/ul>\n<p>Mit\u00e4 tulee yliluokkiin ja alaluokkiin, t\u00e4ss\u00e4 tulee esiin vankka IDE.<\/p>\n<p>On aina mukavaa, jos sinulla on editori, josta pid\u00e4t, mutta sellaisen editori, joka voi intuitiivisesti m\u00e4\u00e4ritt\u00e4\u00e4, mik\u00e4 on p\u00e4\u00e4luokka, mik\u00e4 on perusluokka jne., voi auttaa j\u00e4ljitt\u00e4m\u00e4\u00e4n, j\u00e4ljitt\u00e4m\u00e4\u00e4n, j\u00e4ljitt\u00e4m\u00e4\u00e4n, seuraamaan ja kirjoittamaan uusia. koodi.<\/p>\n<p>Mutta se on sis\u00e4lt\u00f6\u00e4 toiseen postaukseen, joka tulee sen j\u00e4lkeen, kun puhumme suunnittelumalleista.<\/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>Tarkastellaan polymorfismia syv\u00e4llisesti saadaksemme selke\u00e4mm\u00e4n k\u00e4sityksen siit\u00e4, miten se toimii ja miksi se on hy\u00f6dyllist\u00e4.<\/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":[719,895,843,803],"tags":[1166],"class_list":["post-230310","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-kehittaejae","category-koodi","category-opetusohjelmia","category-php-5","tag-affiai-fi"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/230310","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/comments?post=230310"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/230310\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media\/223973"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media?parent=230310"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/categories?post=230310"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/tags?post=230310"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}