{"id":230234,"date":"2022-11-22T15:43:00","date_gmt":"2022-11-22T12:43:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230234"},"modified":"2022-11-22T15:44:20","modified_gmt":"2022-11-22T12:44:20","slug":"classes-abstratas-parte-2-classes-abstratas-e-interfaces","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/classes-abstratas-parte-2-classes-abstratas-e-interfaces\/","title":{"rendered":"Classes Abstratas, Parte 2 &#8211; Classes Abstratas e Interfaces"},"content":{"rendered":"\n<p>No <strong><a href=\"https:\/\/wordpress.mediadoma.com\/pt-pt\/aulas-de-resumo-parte-1-comportamento-de-abstracao\/\" title=\"post anterior\">post anterior<\/a><\/strong> desta s\u00e9rie, passei por:<\/p>\n<ul>\n<li>o b\u00e1sico de classes abstratas,<\/li>\n<li>como implement\u00e1-los,<\/li>\n<li>e forneceu exemplos de c\u00f3digo de trabalho.<\/li>\n<\/ul>\n<p>E embora eu ache que entender as classes abstratas \u00e9 fundamental para estabelecer uma base s\u00f3lida para a programa\u00e7\u00e3o orientada a objetos, muitas vezes vejo que pode ser confuso quando se trata de compar\u00e1-las com interfaces e saber quando us\u00e1-las.<\/p>\n<h2>Classes abstratas e interfaces<\/h2>\n<p>Ent\u00e3o, neste post, vou compartilhar:<\/p>\n<ul>\n<li>uma r\u00e1pida atualiza\u00e7\u00e3o sobre o que s\u00e3o interfaces,<\/li>\n<li>o que s\u00e3o classes abstratas,<\/li>\n<li>e ent\u00e3o como saber quando usar um sobre o outro.<\/li>\n<\/ul>\n<p>Este n\u00e3o deve ser um artigo intensivo de codifica\u00e7\u00e3o, mas deve ajudar a saber quando escrever c\u00f3digo de um determinado tipo para ajudar a organizar melhor seus projetos.<\/p>\n<h3>1 Interfaces<\/h3>\n<p>Lembre-se que quando se trata de interfaces, tamb\u00e9m usamos o termo &#8220;programa\u00e7\u00e3o para uma interface&quot; com a ideia de que a interface define os m\u00e9todos que uma classe deve implementar para cumprir o &#8220;contrato&#8221; com essa interface.<\/p>\n<p><a href=\"https:\/\/gist.github.com\/tommcfarlin\/ff0bd4e2b7ceaebc957342dd41b7709e#file-02-cacheinterface-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">O c\u00f3digo<\/a> usado para demonstrar uma interface b\u00e1sica foi:<\/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>Mas lembre-se, o prop\u00f3sito da interface n\u00e3o \u00e9 definir depois que o c\u00f3digo foi escrito. Em vez disso, \u00e9 uma ferramenta usada para projetar quais classes devem implementar se seguirem um determinado paradigma ou se exigirem um determinado conjunto de fun\u00e7\u00f5es.<\/p>\n<p>Ou seja, se voc\u00ea for projetar um conjunto de classes que funcionem com armazenamento em cache, n\u00e3o escreva as classes primeiro. Voc\u00ea escreve a interface primeiro e, em seguida, as classes implementam essa interface.<\/p>\n<p>A ideia \u00e9 que qualquer classe que implemente a interface tenha a garantia de ter essas fun\u00e7\u00f5es.<\/p>\n<h3>2 Aulas de Resumo<\/h3>\n<p>As classes abstratas, por outro lado, nos permitem fazer <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/5b2936875807f041e98a87f8a5627e8b#file-00-taxonomy-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">duas coisas:<\/a><\/strong><\/p>\n<ol>\n<li>implementar funcionalidades que podem ser usadas por subclasses,<\/li>\n<li>implementar assinaturas de m\u00e9todo que as subclasses devem implementar.<\/li>\n<\/ol>\n<p>Isso pode parecer um pouco incongruente no in\u00edcio, mas considere o seguinte:<\/p>\n<p>Quando voc\u00ea tem uma classe de um certo tipo que ter\u00e1 uma funcionalidade consistente, n\u00e3o importa a subclasse, a funcionalidade vai para a classe abstrata. Quando outros m\u00e9todos precisam ter sua implementa\u00e7\u00e3o de um m\u00e9todo, basta fornecer a assinatura do m\u00e9todo e marc\u00e1-la como <strong>abstract<\/strong>.<\/p>\n<p>Veja um exemplo de um <strong><a href=\"https:\/\/wordpress.mediadoma.com\/pt-pt\/aulas-de-resumo-parte-1-comportamento-de-abstracao\/\" title=\"post anterior:\">post anterior:<\/a><\/strong><\/p>\n<p>Agora, isso nos leva a todos os exemplos anteriores e as coisas anteriores em que precisamos nos concentrar em rela\u00e7\u00e3o a interfaces e classes abstratas, mas para alguns, isso ainda n\u00e3o fornece muita clareza.<\/p>\n<p>Especificamente, isso ainda n\u00e3o responde \u00e0 pergunta: como decidimos quando usar uma classe abstrata e quando usar uma interface?<\/p>\n<p>\u00c0 primeira vista, pode parecer um pouco confuso, mas h\u00e1 algumas coisas que voc\u00ea pode usar para ajudar a tomar a decis\u00e3o.<\/p>\n<h2>Quando usamos cada um?<\/h2>\n<p>Lembre-se que quando se trata de programa\u00e7\u00e3o orientada a objetos, podemos dividi-la em tr\u00eas formas distintas:<\/p>\n<ul>\n<li>As aulas representam uma coisa. Voc\u00ea pode considerar estes um substantivo.<\/li>\n<li>Atributos ou propriedades s\u00e3o como adjetivos. Eles descrevem o objeto ou algo que o objeto pode conter.<\/li>\n<li>M\u00e9todos ou fun\u00e7\u00f5es s\u00e3o como verbos. Eles descrevem o que eles podem fazer.<\/li>\n<\/ul>\n<p>Agora, quando se trata de uma interface, pense no que a interface faz: ela descreve, sem implementa\u00e7\u00e3o, o que um objeto pode fazer. E quando se trata de uma classe abstrata, ela descreve o que \u00e9 um objeto durante o tempo de execu\u00e7\u00e3o.<\/p>\n<p>Em outras palavras, uma boa regra geral \u00e9 que, se voc\u00ea precisar fornecer um conjunto de comportamentos para um objeto, uma interface \u00e9 o caminho a percorrer. Se voc\u00ea precisar descrever o que \u00e9 um objeto, use uma classe abstrata.<\/p>\n<p>Para classes abstratas, eu tamb\u00e9m levaria isso um passo adiante e diria que ajuda a descrever um n\u00edvel b\u00e1sico de dados que descreve um objeto ou o que ele pode armazenar al\u00e9m de um n\u00edvel b\u00e1sico de funcionalidade.<\/p>\n<h3>Tem Um Exemplo?<\/h3>\n<p>Tal como acontece com a maior parte do conte\u00fado em cada um desses posts, tento dar exemplos mesmo que n\u00e3o seja feito especificamente em c\u00f3digo. Talvez isso ajude a explicar ainda mais:<\/p>\n<ul>\n<li><strong>As interfaces n\u00e3o t\u00eam implementa\u00e7\u00e3o.<\/strong> Eles apenas garantem o que uma classe far\u00e1.<\/li>\n<li><strong>As classes abstratas devem ter um n\u00edvel b\u00e1sico de implementa\u00e7\u00e3o<\/strong>. Isso deve representar o que uma classe pode conter e fazer, mas n\u00e3o est\u00e1 completa. Eles exigem um pouco mais de implementa\u00e7\u00e3o da subclasse.<\/li>\n<\/ul>\n<p>Quando voc\u00ea estiver trabalhando com c\u00f3digo orientado a objetos, espero que isso ajude a fornecer algumas diretrizes sobre quando usar o qu\u00ea. Se n\u00e3o, n\u00e3o hesite em deixar um coment\u00e1rio (algo que os membros t\u00eam permiss\u00e3o para fazer :)).<\/p>\n<p>Al\u00e9m disso, veremos isso na pr\u00e1tica quando escrevermos c\u00f3digo orientado a objetos (principalmente para WordPress, mas nem sempre).<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte de grava\u00e7\u00e3o:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Compreender a diferen\u00e7a em classes abstratas e interfaces \u00e9 importante ao escrever 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":[898,722,846],"tags":[1170],"class_list":["post-230234","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo-2","category-desenvolvedor","category-tutoriais","tag-affiai-pt-pt"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/230234","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/comments?post=230234"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/230234\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/164774"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=230234"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=230234"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=230234"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}