{"id":230484,"date":"2022-11-23T19:45:00","date_gmt":"2022-11-23T16:45:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230484"},"modified":"2022-11-23T19:54:55","modified_gmt":"2022-11-23T16:54:55","slug":"guardando-in-profondita-il-polimorfismo","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/it\/guardando-in-profondita-il-polimorfismo\/","title":{"rendered":"Guardando in profondit\u00e0 il polimorfismo"},"content":{"rendered":"\n<p>Quando ho iniziato questa serie, ho parlato dei quattro pilastri della programmazione orientata agli oggetti. Ciascuno di questi argomenti \u00e8 elencato e collegato di seguito.<\/p>\n<ol>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/it\/i-primi-due-pilastri-di-oop\/\" title=\"Astrazione\">Astrazione<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/it\/i-primi-due-pilastri-di-oop\/\" title=\"Incapsulamento\">Incapsulamento<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/it\/i-secondi-due-pilastri-delloop\/\" title=\"Eredit\u00e0\">Eredit\u00e0<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/it\/i-secondi-due-pilastri-delloop\/\" title=\"Polimorfismo\">Polimorfismo<\/a><\/strong><\/li>\n<\/ol>\n<p>A questo punto, normalmente vorrei iniziare a passare al prossimo argomento. Prima di farlo, per\u00f2, vorrei dedicare un altro post all&#8217;esplorazione del concetto di polimorfismo.<\/p>\n<p>Nella mia carriera, finora, ho visto pochi argomenti dare a coloro che si avvicinano alla programmazione orientata agli oggetti pi\u00f9 confusione e problemi rispetto al polimorfismo. Quindi vorrei discuterne un po&#8217; pi\u00f9 in profondit\u00e0 nel contesto della programmazione orientata agli oggetti e al di fuori di qualsiasi framework o applicazione particolare (come WordPress).<\/p>\n<p>In questo post, far\u00f2 una rapida rassegna di ci\u00f2 di cui abbiamo discusso finora, quindi torner\u00f2 al polimorfismo.<\/p>\n<h2>Approfondimento sul polimorfismo<\/h2>\n<p>Innanzitutto, come accennato, voglio rivedere rapidamente ci\u00f2 che \u00e8 stato discusso finora, soprattutto se hai sorvolato su uno qualsiasi dei post precedenti.<\/p>\n<p>Non preoccuparti: niente di seguito divaga nel codice. Invece, definisce semplicemente i termini che abbiamo usato in modo da avere un&#8217;idea di ci\u00f2 a cui mi riferisco ogni volta che vedi la parola spuntare in questa serie.<\/p>\n<h3>Astrazione<\/h3>\n<blockquote>\n<p>Astraiamo l&#8217;idea di qualcosa in una classe. Invece, astrarremo le idee nelle loro classi. E qui c&#8217;\u00e8 un&#8217;idea chiave: una classe dovrebbe rappresentare un sostantivo.<\/p>\n<\/blockquote>\n<h3>Incapsulamento<\/h3>\n<blockquote>\n<p>Incapsulamento \u00e8 in realt\u00e0 solo una parola &quot;grande&quot; che si riferisce all&#8217;idea di gestire le proprie responsabilit\u00e0 (o tenere traccia dei propri dati).<\/p>\n<\/blockquote>\n<h3>Eredit\u00e0<\/h3>\n<blockquote>\n<p>L&#8217;ereditariet\u00e0 si riferisce all&#8217;idea che una classe, sebbene abbia una propria implementazione, eredita letteralmente propriet\u00e0, funzioni e implementazione generale da una classe padre.<\/p>\n<\/blockquote>\n<h3>Polimorfismo<\/h3>\n<blockquote>\n<p>Il polimorfismo ci consente di fare riferimento a una classe di un tipo quando pu\u00f2 essere dichiarata come un altro tipo.<\/p>\n<\/blockquote>\n<p>Detto questo, \u00e8 qui che penso che le cose possano diventare un po&#8217; pi\u00f9 complicate. Nei post precedenti, ho fornito una serie di esempi di codice diversi (e ti esorto a guardarli indietro).<\/p>\n<p>Ma nel post di oggi, cercher\u00f2 di esplorare un po&#8217; pi\u00f9 a fondo l&#8217;idea sia nella spiegazione che nel codice.<\/p>\n<h2>Relativo all&#8217;eredit\u00e0<\/h2>\n<p>Se non \u00e8 evidente a questo punto, il polimorfismo \u00e8 fortemente correlato all&#8217;ereditariet\u00e0. Pensala in questo modo: se una classe eredita propriet\u00e0 e metodi da un&#8217;altra classe, pu\u00f2 &quot;stare al posto&quot; della classe genitore.<\/p>\n<p>Ci\u00f2 significa che se hai qualcosa come una\u00a0 classe <strong>Content<\/strong> e poi hai due sottoclassi, una che \u00e8 un <strong>Post<\/strong> e l&#8217;altra che \u00e8 una <strong>Pagina<\/strong>, puoi creare un&#8217;istanza della classe usando il\u00a0 tipo di riferimento del <strong>contenuto.t<\/strong><\/p>\n<p>Ma in fase di esecuzione, sar\u00e0 effettivamente un&#8217;istanza del\u00a0 tipo <strong>Post<\/strong>. Ha senso? Ecco del codice come esempio.<\/p>\n<p>Innanzitutto, inizieremo con la definizione di una\u00a0 classe <a href=\"https:\/\/gist.github.com\/tommcfarlin\/cd3e2afb65810ed9cf423ad7c8f8e532#file-00-content-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Content<\/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>Ha le propriet\u00e0 generali che probabilmente ti aspetteresti: titolo, contenuto e metadati. Certo, queste propriet\u00e0 sono solo stringhe ma potrebbero essere strutture di dati pi\u00f9 elaborate in una situazione del mondo reale.<\/p>\n<p>Ora diamo un&#8217;occhiata a un <strong>post<\/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>Cosa succede, quindi, se chiami un metodo sulla\u00a0 classe <strong>Post<\/strong>, come <strong>getTitle<\/strong>, che non esiste ma esiste nella\u00a0 classe <strong>Content<\/strong>? Quindi, a causa dell&#8217;ereditariet\u00e0, cercher\u00e0 il metodo in <strong>Post<\/strong>, non lo trover\u00e0, quindi inizier\u00e0 a cercarlo in <strong>Content<\/strong>.<\/p>\n<p>Se viene trovato, lo eseguir\u00e0.<\/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=\"Guardando in profondit\u00e0 il polimorfismo\"><\/a><\/p>\n<p>Allo stesso modo, possiamo fare qualcosa del genere con la classe <a href=\"https:\/\/gist.github.com\/tommcfarlin\/cd3e2afb65810ed9cf423ad7c8f8e532#file-02-page-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Page e i dati del contenuto.<\/a> Innanzitutto, istanziamo la classe base, quindi impostiamo propriet\u00e0 specifiche per <strong>Page<\/strong>. In questo caso, sar\u00e0 una categoria.<\/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>Ora, quando eseguiamo il codice, possiamo iniziare con il <strong>contenuto:<\/strong><\/p>\n<pre><code>&lt;?php\n\n$content = new Content();\necho $content-&gt;getTitle();<\/code><\/pre>\n<p>Nota che questo sembra che ci aspetteremmo dal momento che abbiamo un titolo e abbiamo contenuto. Diamo un&#8217;occhiata anche al <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>Funziona perch\u00e9 abbiamo un autore, ma abbiamo anche un titolo perch\u00e9 risiede in <strong>Contenuto<\/strong>. Ma se proviamo a chiamare <strong>getAuthor<\/strong> su un&#8217;istanza di <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>Otterremo un errore perch\u00e9 il metodo non risiede in quella classe.<\/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=\"Guardando in profondit\u00e0 il polimorfismo\"><\/a><\/p>\n<p>Allora cosa dobbiamo fare? Dal momento che non abbiamo tipi forti in PHP, non possiamo eseguirne il cast su un tipo diverso.<\/p>\n<p>Ci sono modelli di progettazione per questo, di cui parler\u00f2 in una serie di post futuri, ma PHP non lo consente facilmente come alcuni altri linguaggi (come C# o Java).<\/p>\n<h2>Domande sul polimorfismo<\/h2>\n<p>Si spera che il codice precedente ti dia un&#8217;idea di come un tipo concreto come un <strong>Post\u00a0<\/strong> o una <strong>Pagina<\/strong> pu\u00f2 avere implicitamente le propriet\u00e0 e i metodi della sua classe base, <strong>Content<\/strong>, usata in fase di esecuzione.<\/p>\n<p>Ma solleva anche alcune domande, no? Per esempio:<\/p>\n<ul>\n<li><strong>Perch\u00e9 il polimorfismo \u00e8 utile?<\/strong> Alla fine, \u00e8 una questione di flessibilit\u00e0. Cio\u00e8, puoi scrivere un\u00a0 tipo di <strong>Contenuto<\/strong> generico ma poi creare un <strong>Post<\/strong> o una <strong>Pagina<\/strong> come abbiamo visto sopra. Questo ci offre quindi tutti i vantaggi della\u00a0 classe <strong>Content<\/strong> e allo stesso tempo ci d\u00e0 anche la specificit\u00e0 della\u00a0 classe <strong>Post<\/strong>, ad esempio.<\/li>\n<li><strong>Questo sembra essere pi\u00f9 confuso che flessibile.<\/strong> In un certo senso, \u00e8 fonte di confusione perch\u00e9 il codice richiede un po&#8217; di traccia. Cio\u00e8, potresti iniziare nella\u00a0 classe <strong>Post<\/strong> e dover cercare ci\u00f2 che offre la classe <strong>Contenuto .<\/strong> D&#8217;altra parte, rende anche molto facile introdurre una nuova\u00a0 sottoclasse di <strong>contenuto<\/strong> e quindi usarla quando \u00e8 pi\u00f9 adatta in fase di esecuzione.<\/li>\n<\/ul>\n<p>Per quanto riguarda le superclassi e le sottoclassi, \u00e8 qui che entra in gioco un solido IDE.<\/p>\n<p>\u00c8 sempre bello avere un editor che ti piace, certo, ma averne uno in grado di determinare intuitivamente qual \u00e8 la classe genitore, qual \u00e8 la classe base, ecc., pu\u00f2 aiutare molto a tracciare, eseguire il debug, seguire e scrivere nuovi codice.<\/p>\n<p>Ma questo \u00e8 il contenuto di un altro post che verr\u00e0 dopo aver parlato di design pattern.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte di registrazione:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Diamo un&#8217;occhiata al polimorfismo in profondit\u00e0 per avere un&#8217;idea pi\u00f9 chiara di come funziona e perch\u00e9 \u00e8 vantaggioso.<\/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":[896,804,720,844],"tags":[1168],"class_list":["post-230484","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codice","category-php-6","category-sviluppatore","category-tutorial","tag-affiai-it"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/230484","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/comments?post=230484"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/230484\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media\/223973"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media?parent=230484"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/categories?post=230484"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/tags?post=230484"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}