{"id":229737,"date":"2022-11-23T19:36:00","date_gmt":"2022-11-23T16:36:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229737"},"modified":"2022-11-23T19:36:55","modified_gmt":"2022-11-23T16:36:55","slug":"tittar-paa-polymorfism-paa-djupet","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/sv\/tittar-paa-polymorfism-paa-djupet\/","title":{"rendered":"Tittar p\u00e5 polymorfism p\u00e5 djupet"},"content":{"rendered":"\n<p>N\u00e4r jag startade den h\u00e4r serien pratade jag om de fyra pelarna i objektorienterad programmering. Var och en av dessa \u00e4mnen \u00e4r listade och l\u00e4nkade nedan.<\/p>\n<ol>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/sv\/de-tvaa-foersta-pelarna-i-oop\/\" title=\"Abstraktion\">Abstraktion<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/sv\/de-tvaa-foersta-pelarna-i-oop\/\" title=\"Inkapsling\">Inkapsling<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/sv\/de-andra-tvaa-pelarna-i-oop\/\" title=\"Arv\">Arv<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/sv\/de-andra-tvaa-pelarna-i-oop\/\" title=\"Polymorfism\">Polymorfism<\/a><\/strong><\/li>\n<\/ol>\n<p>Vid det h\u00e4r laget skulle jag normalt vilja b\u00f6rja g\u00e5 vidare till n\u00e4sta \u00e4mne. Innan jag g\u00f6r det skulle jag dock vilja spendera ett inl\u00e4gg till med att utforska begreppet polymorfism.<\/p>\n<p>I min karri\u00e4r har jag hittills sett f\u00e5 \u00e4mnen som ger dem som kommer in i objektorienterad programmering mer f\u00f6rvirring och problem \u00e4n polymorfism. S\u00e5 jag skulle vilja diskutera det lite mer ing\u00e5ende inom ramen f\u00f6r objektorienterad programmering och utanf\u00f6r n\u00e5gon speciell ram eller applikation (som WordPress).<\/p>\n<p>I det h\u00e4r inl\u00e4gget kommer jag att g\u00f6ra en snabb genomg\u00e5ng av vad vi har diskuterat hittills, och sedan hoppa tillbaka till polymorfism.<\/p>\n<h2>F\u00f6rdjupad polymorfism<\/h2>\n<p>F\u00f6rst, som n\u00e4mnts, vill jag snabbt granska vad som har diskuterats hittills, s\u00e4rskilt om du har slarvat bort n\u00e5got av de tidigare inl\u00e4ggen.<\/p>\n<p>Oroa dig inte: Inget nedan g\u00e5r ut i kod. Ist\u00e4llet definierar den helt enkelt termerna vi har anv\u00e4nt s\u00e5 att du har en uppfattning om vad jag syftar p\u00e5 n\u00e4r du ser ordet dyka upp i den h\u00e4r serien.<\/p>\n<h3>Abstraktion<\/h3>\n<blockquote>\n<p>Vi abstraherar id\u00e9n om n\u00e5got till en klass. Ist\u00e4llet kommer vi att abstrahera id\u00e9er i deras klasser. Och det finns en nyckelid\u00e9 h\u00e4r: En klass ska representera ett substantiv.<\/p>\n<\/blockquote>\n<h3>Inkapsling<\/h3>\n<blockquote>\n<p>Inkapsling \u00e4r egentligen bara ett &quot;stort&quot; ord som h\u00e4nvisar till id\u00e9n att hantera sitt ansvar (eller h\u00e5lla reda p\u00e5 dess data).<\/p>\n<\/blockquote>\n<h3>Arv<\/h3>\n<blockquote>\n<p>Arv h\u00e4nvisar till id\u00e9n att en klass, \u00e4ven om den har sin egen implementering, bokstavligen \u00e4rver egenskaper, funktioner och generell implementering fr\u00e5n en \u00f6verordnad klass.<\/p>\n<\/blockquote>\n<h3>Polymorfism<\/h3>\n<blockquote>\n<p>Polymorfism till\u00e5ter oss att referera till en klass av en typ n\u00e4r den kan deklareras som en annan typ.<\/p>\n<\/blockquote>\n<p>Med det sagt, det \u00e4r h\u00e4r jag tror att saker och ting kan bli lite mer komplicerade. I de tidigare inl\u00e4ggen har jag gett ett antal olika kodexempel (och jag uppmanar dig att titta tillbaka p\u00e5 dem).<\/p>\n<p>Men i dagens inl\u00e4gg ska jag f\u00f6rs\u00f6ka utforska id\u00e9n lite mer b\u00e5de i f\u00f6rklaring \u00e4n i kod.<\/p>\n<h2>Ang\u00e5ende arv<\/h2>\n<p>Om det inte \u00e4r uppenbart vid denna tidpunkt, \u00e4r polymorfism starkt relaterad till arv. T\u00e4nk p\u00e5 det s\u00e5 h\u00e4r: Om en klass \u00e4rver egenskaper och metoder fr\u00e5n en annan klass, kan den &quot;st\u00e5 p\u00e5 plats&quot; f\u00f6r den \u00f6verordnade klassen.<\/p>\n<p>Det betyder att om du har n\u00e5got som en <strong>inneh\u00e5llsklass<\/strong> och sedan har tv\u00e5 underklasser, en \u00e4r ett <strong>inl\u00e4gg<\/strong> och en \u00e4r en <strong>sida<\/strong>, kan du instansiera klassen genom att anv\u00e4nda referenstypen f\u00f6r <strong>inneh\u00e5ll.t<\/strong><\/p>\n<p>Men vid k\u00f6rning kommer det faktiskt att vara en instans av typen <strong>Post .<\/strong> Vettigt? H\u00e4r \u00e4r lite kod som exempel.<\/p>\n<p>F\u00f6rst b\u00f6rjar vi med att definiera en <a href=\"https:\/\/gist.github.com\/tommcfarlin\/cd3e2afb65810ed9cf423ad7c8f8e532#file-00-content-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">inneh\u00e5llsklass<\/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>Den har de allm\u00e4nna egenskaperna som du f\u00f6rmodligen har f\u00f6rv\u00e4ntat dig \u2013 titel, inneh\u00e5ll och metadata. Visst, dessa egenskaper \u00e4r bara str\u00e4ngar men de kan vara mer utarbetade datastrukturer i en verklig situation.<\/p>\n<p>L\u00e5t oss nu titta p\u00e5 ett <strong>inl\u00e4gg<\/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>Vad h\u00e4nder d\u00e5 om du anropar en metod i\u00a0 klassen <strong>Post<\/strong>, som <strong>getTitle<\/strong>, som inte existerar men den finns i klassen <strong>Content<\/strong>? Sedan p\u00e5 grund av arv kommer den att leta efter metoden i <strong>Post<\/strong>, inte hitta den, och sedan b\u00f6rja leta efter den i <strong>Inneh\u00e5ll<\/strong>.<\/p>\n<p>Om den hittas kommer den att k\u00f6ra den.<\/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=\"Tittar p\u00e5 polymorfism p\u00e5 djupet\"><\/a><\/p>\n<p>P\u00e5 samma s\u00e4tt kan vi g\u00f6ra n\u00e5got s\u00e5 h\u00e4r med <a href=\"https:\/\/gist.github.com\/tommcfarlin\/cd3e2afb65810ed9cf423ad7c8f8e532#file-02-page-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">sidklassen<\/a> och inneh\u00e5llsdata. F\u00f6rst instansierar vi basklassen och sedan st\u00e4ller vi in \u200b\u200begenskaper som \u00e4r specifika f\u00f6r <strong>sidan<\/strong>. I det h\u00e4r fallet kommer det att bli en kategori.<\/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>Nu n\u00e4r vi k\u00f6r koden kan vi b\u00f6rja med <strong>inneh\u00e5llet:<\/strong><\/p>\n<pre><code>&lt;?php\n\n$content = new Content();\necho $content-&gt;getTitle();<\/code><\/pre>\n<p>L\u00e4gg m\u00e4rke till att detta ser ut som vi f\u00f6rv\u00e4ntar oss eftersom vi har en titel och vi har inneh\u00e5ll. L\u00e5t oss ocks\u00e5 titta p\u00e5 <strong>inl\u00e4gget<\/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>Detta fungerar eftersom vi har en f\u00f6rfattare men vi har ocks\u00e5 en titel eftersom den finns i <strong>Inneh\u00e5ll<\/strong>. Men om vi f\u00f6rs\u00f6ker ringa <strong>getAuthor<\/strong> p\u00e5 en instans av <strong>Post?<\/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>Vi kommer att f\u00e5 ett fel eftersom metoden inte finns i den klassen.<\/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=\"Tittar p\u00e5 polymorfism p\u00e5 djupet\"><\/a><\/p>\n<p>S\u00e5 vad ska vi g\u00f6ra? Eftersom vi inte har starka typer i PHP kan vi inte casta det till en annan typ.<\/p>\n<p>Det finns designm\u00f6nster f\u00f6r detta, som jag kommer att diskutera i en framtida upps\u00e4ttning inl\u00e4gg, men PHP till\u00e5ter inte detta lika l\u00e4tt som vissa andra spr\u00e5k (som C# eller Java).<\/p>\n<h2>Fr\u00e5gor om polymorfism<\/h2>\n<p>F\u00f6rhoppningsvis ger koden ovan dig en uppfattning om hur en konkret typ som ett <strong>inl\u00e4gg\u00a0<\/strong> eller en <strong>sida<\/strong> implicit kan ha egenskaperna och metoderna f\u00f6r sin basklass, <strong>Content<\/strong>, som anv\u00e4nds vid k\u00f6rning.<\/p>\n<p>Men det v\u00e4cker ocks\u00e5 n\u00e5gra fr\u00e5gor, eller hur? Till exempel:<\/p>\n<ul>\n<li><strong>Varf\u00f6r \u00e4r polymorfism anv\u00e4ndbart?<\/strong> Ytterst handlar det om flexibilitet. Det vill s\u00e4ga, du kan skriva en generisk <strong>inneh\u00e5llstyp<\/strong> men sedan skapa ett <strong>inl\u00e4gg<\/strong> eller en <strong>sida<\/strong> som vi har sett ovan. Detta ger oss sedan alla f\u00f6rdelar med <strong>Content<\/strong> -klassen samtidigt som det ger oss t.ex. <strong>Post -klassens specificitet.<\/strong><\/li>\n<li><strong>Detta verkar vara mer f\u00f6rvirrande \u00e4n flexibelt.<\/strong> P\u00e5 ett s\u00e4tt \u00e4r det f\u00f6rvirrande eftersom koden kr\u00e4ver lite sp\u00e5rning. Det vill s\u00e4ga, du kanske b\u00f6rjar i <strong>Post<\/strong> -klassen och m\u00e5ste se upp till vad <strong>inneh\u00e5llsklassen<\/strong> erbjuder. \u00c5 andra sidan g\u00f6r det det ocks\u00e5 v\u00e4ldigt enkelt att introducera en ny\u00a0 underklass f\u00f6r <strong>inneh\u00e5ll<\/strong> och sedan anv\u00e4nda den n\u00e4r den passar b\u00e4st under k\u00f6rning.<\/li>\n<\/ul>\n<p>N\u00e4r det g\u00e4ller superklasser och underklasser \u00e4r det h\u00e4r att ha en solid IDE kommer in i bilden.<\/p>\n<p>Det \u00e4r alltid trevligt att ha en editor som du gillar, visst, men att ha en som intuitivt kan avg\u00f6ra vad som \u00e4r f\u00f6r\u00e4ldraklassen, vad som \u00e4r basklassen, etc., kan hj\u00e4lpa dig att sp\u00e5ra, fels\u00f6ka, f\u00f6lja och skriva nytt. koda.<\/p>\n<p>Men det \u00e4r inneh\u00e5ll f\u00f6r ett annat inl\u00e4gg som kommer efter att vi pratat om designm\u00f6nster.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Inspelningsk\u00e4lla:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>L\u00e5t oss titta p\u00e5 polymorfism p\u00e5 djupet f\u00f6r att f\u00e5 en tydligare uppfattning om hur det fungerar och varf\u00f6r det \u00e4r f\u00f6rdelaktigt.<\/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":[848,901,807,724],"tags":[1173],"class_list":["post-229737","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-handledningar","category-koda","category-php-9","category-utvecklaren","tag-affiai-sv"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/229737","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/comments?post=229737"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/229737\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media\/223973"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media?parent=229737"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/categories?post=229737"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/tags?post=229737"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}