{"id":229894,"date":"2022-11-22T15:22:00","date_gmt":"2022-11-22T12:22:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229894"},"modified":"2022-11-22T15:22:12","modified_gmt":"2022-11-22T12:22:12","slug":"clases-abstractas-parte-2-clases-abstractas-e-interfaces","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/es\/clases-abstractas-parte-2-clases-abstractas-e-interfaces\/","title":{"rendered":"Clases abstractas, Parte 2 &#8211; Clases abstractas e interfaces"},"content":{"rendered":"\n<p>En <strong><a href=\"https:\/\/wordpress.mediadoma.com\/es\/clases-abstractas-parte-1-comportamiento-de-abstraccion\/\" title=\"la publicaci\u00f3n anterior\">la publicaci\u00f3n anterior<\/a><\/strong> de esta serie, expuse:<\/p>\n<ul>\n<li>los fundamentos de las clases abstractas,<\/li>\n<li>c\u00f3mo implementarlos,<\/li>\n<li>y proporcion\u00f3 ejemplos de c\u00f3digo de trabajo.<\/li>\n<\/ul>\n<p>Y aunque creo que comprender las clases abstractas es clave para sentar una base s\u00f3lida para la programaci\u00f3n orientada a objetos, a menudo veo que puede ser confuso compararlas con las interfaces y saber cu\u00e1ndo usarlas.<\/p>\n<h2>Clases abstractas e interfaces<\/h2>\n<p>Entonces, en esta publicaci\u00f3n, voy a compartir:<\/p>\n<ul>\n<li>un repaso r\u00e1pido sobre qu\u00e9 son las interfaces,<\/li>\n<li>qu\u00e9 son las clases abstractas,<\/li>\n<li>y luego c\u00f3mo saber cu\u00e1ndo usar uno sobre el otro.<\/li>\n<\/ul>\n<p>Este no deber\u00eda ser un art\u00edculo intensivo en codificaci\u00f3n, pero deber\u00eda ayudar a saber cu\u00e1ndo escribir c\u00f3digo de cierto tipo para ayudar a organizar mejor sus proyectos.<\/p>\n<h3>1 interfaces<\/h3>\n<p>Recuerde que cuando se trata de interfaces, tambi\u00e9n usamos el t\u00e9rmino &quot;programar a una interfaz&quot; con la idea de que la interfaz define los m\u00e9todos que debe implementar una clase para cumplir el &quot;contrato&quot; con dicha interfaz.<\/p>\n<p><a href=\"https:\/\/gist.github.com\/tommcfarlin\/ff0bd4e2b7ceaebc957342dd41b7709e#file-02-cacheinterface-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">El c\u00f3digo<\/a> utilizado para demostrar una interfaz b\u00e1sica fue:<\/p>\n<pre><code>&lt;?php\n\ninterface iCache \n{\n  public function set($key, $value);\n  public function get($key);\n  public function has($key);\n}\n<\/code><\/pre>\n<p>Pero recuerde, el prop\u00f3sito de la interfaz no es definir despu\u00e9s de que se haya escrito el c\u00f3digo. En cambio, es una herramienta utilizada para dise\u00f1ar qu\u00e9 clases deber\u00edan implementar si siguen un determinado paradigma o si requieren un determinado conjunto de funciones.<\/p>\n<p>Es decir, si va a dise\u00f1ar un conjunto de clases que funcionan con el almacenamiento en cach\u00e9, no escriba las clases primero. Primero escribe la interfaz y luego las clases implementan dicha interfaz.<\/p>\n<p>La idea es que se garantice que cualquier clase que implemente la interfaz tenga esas funciones.<\/p>\n<h3>2 clases abstractas<\/h3>\n<p>Las clases abstractas, por otro lado, nos permiten hacer <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/5b2936875807f041e98a87f8a5627e8b#file-00-taxonomy-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">dos cosas:<\/a><\/strong><\/p>\n<ol>\n<li>implementar funcionalidad que puede ser utilizada por subclases,<\/li>\n<li>implementar firmas de m\u00e9todos que las subclases deben implementar.<\/li>\n<\/ol>\n<p>Esto puede parecer un poco incongruente al principio, pero considere esto:<\/p>\n<p>Cuando tiene una clase de cierto tipo que tendr\u00e1 una funcionalidad consistente sin importar la subclase, la funcionalidad va a la clase abstracta. Cuando otros m\u00e9todos necesitan tener su implementaci\u00f3n de un m\u00e9todo, simplemente proporcione la firma del m\u00e9todo y m\u00e1rquelo como <strong>abstract<\/strong>.<\/p>\n<p>Aqu\u00ed hay un ejemplo de una <strong><a href=\"https:\/\/wordpress.mediadoma.com\/es\/clases-abstractas-parte-1-comportamiento-de-abstraccion\/\" title=\"publicaci\u00f3n anterior:\">publicaci\u00f3n anterior:<\/a><\/strong><\/p>\n<p>Ahora, esto nos pone al d\u00eda con los ejemplos anteriores y las cosas anteriores en las que debemos centrarnos con respecto a las interfaces y las clases abstractas, pero para algunos, esto todav\u00eda no proporciona mucha claridad.<\/p>\n<p>Espec\u00edficamente, esto todav\u00eda no responde la pregunta: \u00bfC\u00f3mo decidimos cu\u00e1ndo usar una clase abstracta y cu\u00e1ndo usar una interfaz?<\/p>\n<p>En la superficie, puede sonar un poco confuso, pero hay algunas cosas que puede usar para ayudar a tomar una decisi\u00f3n.<\/p>\n<h2>\u00bfCu\u00e1ndo usamos cada uno?<\/h2>\n<p>Recuerde que cuando se trata de programaci\u00f3n orientada a objetos, podemos dividirla en tres formas distintas:<\/p>\n<ul>\n<li>Las clases representan una cosa. Puedes considerar estos como un sustantivo.<\/li>\n<li>Los atributos o propiedades son como adjetivos. Describen el objeto o algo que el objeto puede contener.<\/li>\n<li>Los m\u00e9todos o funciones son como los verbos. Describen lo que se oponen puede hacer.<\/li>\n<\/ul>\n<p>Ahora, cuando se trata de una interfaz, piense en lo que hace la interfaz: describe, sin implementaci\u00f3n, lo que puede hacer un objeto. Y cuando se trata de una clase abstracta, describe qu\u00e9 es un objeto durante el tiempo de ejecuci\u00f3n.<\/p>\n<p>En otras palabras, una buena regla general es que si necesita proporcionar un conjunto de comportamientos para un objeto, una interfaz es el camino a seguir. Si necesita describir qu\u00e9 es un objeto, use una clase abstracta.<\/p>\n<p>Para las clases abstractas, tambi\u00e9n llevar\u00eda esto un paso m\u00e1s all\u00e1 y dir\u00eda que ayuda a describir un nivel b\u00e1sico de datos que describe un objeto o lo que podr\u00eda almacenar adem\u00e1s de un nivel b\u00e1sico de funcionalidad.<\/p>\n<h3>\u00bfTienes un ejemplo?<\/h3>\n<p>Al igual que con la mayor\u00eda del contenido de cada una de estas publicaciones, trato de dar ejemplos incluso si no se hace espec\u00edficamente en el c\u00f3digo. Quiz\u00e1s esto ayude a explicarlo a\u00fan m\u00e1s:<\/p>\n<ul>\n<li><strong>Las interfaces no tienen implementaci\u00f3n.<\/strong> Solo garantizan lo que har\u00e1 una clase.<\/li>\n<li><strong>Las clases abstractas deben tener un nivel base de implementaci\u00f3n<\/strong>. Esto deber\u00eda representar lo que una clase puede contener y hacer, pero no est\u00e1 completa. Requieren un poco m\u00e1s de implementaci\u00f3n de la subclase.<\/li>\n<\/ul>\n<p>Cuando trabaje con c\u00f3digo orientado a objetos, espero que esto ayude a proporcionar algunas pautas sobre cu\u00e1ndo usar qu\u00e9. Si no, no dudes en dejar un comentario (algo que los miembros tienen permiso para hacer :).<\/p>\n<p>Adem\u00e1s, veremos esto en la pr\u00e1ctica cuando comencemos a escribir c\u00f3digo orientado a objetos (sobre todo para WordPress, pero no siempre).<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fuente de grabaci\u00f3n:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Comprender la diferencia en las clases e interfaces abstractas es importante cuando se escribe c\u00f3digo orientado a objetos.<\/p>\n","protected":false},"author":1,"featured_media":164774,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[892,716,840],"tags":[1172],"class_list":["post-229894","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo","category-desarrollador","category-tutoriales","tag-affiai-es"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/229894","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/comments?post=229894"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/229894\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media\/164774"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media?parent=229894"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/categories?post=229894"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/tags?post=229894"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}