Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

lorena85

Classes Abstract

Recommended Posts

É raro, mas muito raro criarmos uma classe abstrata de primeira.

 

Tudo depende da forma que você está fazendo. Classes abstratas são geralmente criadas durante uma refactoring para remover duplicação de código. Considere o seguinte código:

 

<?php

class JuniorProgrammer {
    private $name;
    private $language;

    public function __construct($name, $language) {
        $this->name = $name;
        $this->language = $language;
    }

    public function getName() {
        return $this->name;
    }

    public function getLanguage() {
        return $this->language;
    }

    public function getWage() {
        return 1000.00;
    }

    public function getWageFormatted() {
        return number_format($this->getWage(), 2, ',', '.');
    }

    public function __toString() {
        $wage = $this->getWageFormatted();
        return <<<DESCRIPTION
Programador $this->name
Linguagem de programação: $this->language
Salário: R$ $wage
DESCRIPTION;
    }
}

class SeniorProgrammer {
    private $name;
    private $language;

    public function __construct($name, $language) {
        $this->name = $name;
        $this->language = $language;
    }

    public function getName() {
        return $this->name;
    }

    public function getLanguage() {
        return $this->language;
    }

    public function getWage() {
        return 8000.00;
    }

    public function getWageFormatted() {
        return number_format($this->getWage(), 2, ',', '.');
    }

    public function __toString() {
        $wage = $this->getWageFormatted();
        return <<<DESCRIPTION
Programador $this->name
Linguagem de programação: $this->language
Salário: R$ $wage
DESCRIPTION;
    }
}

$junior = new JuniorProgrammer('José', 'Python');
echo $junior->getName() . PHP_EOL;
echo $junior->getLanguage() . PHP_EOL;
echo $junior->getWageFormatted() . PHP_EOL;
echo $junior . PHP_EOL;

$junior = new SeniorProgrammer('Michael', 'C++');
echo $junior->getName() . PHP_EOL;
echo $junior->getLanguage() . PHP_EOL;
echo $junior->getWageFormatted() . PHP_EOL;
echo $junior . PHP_EOL;

 

Como um JuniorProgrammer e um SeniorProgrammer têm código duplicado, poderia haver uma classe abstrata para resolver este problema:

 

<?php

abstract class Programmer {
    private $name;
    private $language;

    public function __construct($name, $language) {
        $this->name = $name;
        $this->language = $language;
    }

    public function getName() {
        return $this->name;
    }

    public function getLanguage() {
        return $this->language;
    }

    public function getWageFormatted() {
        return number_format($this->getWage(), 2, ',', '.');
    }

    public function __toString() {
        $wage = $this->getWageFormatted();
        return <<<DESCRIPTION
Programador $this->name
Linguagem de programação: $this->language
Salário: R$ $wage
DESCRIPTION;
    }

    abstract public function getWage();
}

class JuniorProgrammer extends Programmer {
    public function getWage() {
        return 1000.00;
    }
}

class SeniorProgrammer extends Programmer {
    public function getWage() {
        return 8000.00;
    }
}

$junior = new JuniorProgrammer('José', 'Python');
echo $junior->getName() . PHP_EOL;
echo $junior->getLanguage() . PHP_EOL;
echo $junior->getWageFormatted() . PHP_EOL;
echo $junior . PHP_EOL;

$junior = new SeniorProgrammer('Michael', 'C++');
echo $junior->getName() . PHP_EOL;
echo $junior->getLanguage() . PHP_EOL;
echo $junior->getWageFormatted() . PHP_EOL;
echo $junior . PHP_EOL;

 

Assim reduzimos a duplicação. Mas nada impede que Programmer seja concreto ou JuniorProgrammer/SeniorProgrammer sejam abstratos, isso é uma questão de pensamento, que depende do problema.

Compartilhar este post


Link para o post
Compartilhar em outros sites

mostrar que abstração != classe abstrata

Até agora, esse foi o comentário mais pertinente de toda a discussão.

 

Eu postei dois artigos, um falando sobre abstração e outro sobre encapsulação. Aparentemente, preferiram ignorá-los.

 

Uma abstração define as características essenciais de um objeto que permite distingui-lo de outros objetos, fornecendo uma definição conceitual sobre os limites desse objeto do ponto de vista do observador.

 

Quando se compreende isso, fica fácil perceber que não importa se o participante é uma classe concreta ou abstrata, o que importa é que o participante que a utiliza não tenha conhecimento sobre sua implementação, mas apenas sobre os limites desse objeto.

 

Abstração nada mais é do que um conceito.

 

Classe abstrata trata-se do reaproveitamento de código, onde através de uma base, podemos criar uma hierarquia vertical, reutilizando essa base, para criar implementações especializadas.

 

Porém, abstração não ocorre apenas com classes abstratas. Do ponto de vista do objeto que está utilizando, uma classe concreta é uma abstração, se o objeto que está utilizando não tiver conhecimento específico sobre a implementação.

Compartilhar este post


Link para o post
Compartilhar em outros sites

@João Batista Neto

Uma abstração define as características essenciais de um objeto

Você quis dizer que uma abstração é quando focamos nas características principais desse objeto, correto???
Exemplo de abstração de animal:
animal (fala, lati, etc ...), todo animal (se locomovem: andando, voando ou nadando), todo animal (tem uma idade), todo animal (tem uma genética) ...

que permite distingui-lo de outros objetos,

Exemplo:
Animal: humano é diferente de um Animal: elefante

correto??

 

fornecendo uma definição conceitual sobre os limites desse objeto do ponto de vista do observador.

essa parte não entendi

 

Classe abstrata trata-se do reaproveitamento de código, onde através de uma base, podemos criar uma hierarquia vertical, reutilizando essa base, para criar implementações especializadas.

Hierarquia vertical?? desculpe o não entendimento, mas o que você quis dizer sobre podemos criar uma hierarquia vertical, reutilizando essa base, para criar implementações especializadas.

 

Porém, abstração não ocorre apenas com classes abstratas. Do ponto de vista do objeto que está utilizando, uma classe concreta é uma abstração, se o objeto que está utilizando não tiver conhecimento específico sobre a implementação.

Bem nessa parte intendi que abstração depende de vários fatores do observador. Como hora a classe animal pode ser classe abstrata, hora não vai ser uma classe abstrata. vai depender do ponto de vista do programador, É isso??

Compartilhar este post


Link para o post
Compartilhar em outros sites

Lorena,

Você quis dizer que uma abstração é quando focamos nas características principais desse objeto, correto???

Exemplo de abstração de animal:

animal (fala, lati, etc ...), todo animal (se locomovem: andando, voando ou nadando), todo animal (tem uma idade), todo animal (tem uma genética) ...

Essas analogias estão atrapalhando seu entendimento. Você chegou a ler os dois artigos que indiquei?

 

http://thegodclass.tumblr.com/post/9665624509/abstracao

http://thegodclass.tumblr.com/post/9704477531/encapsulacao

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim, li os dois artigos!

 

* No primeiro artigo fala que a abstração, tem o mesmo conceito sobre "substantivos abstratos"

 

* E no segundo fala sobre o encapsulamento: encapsulamento é uma maneira que não importa como será, e de que maneira será feito (no caso a morte do gato), só se sabe que o gato estará morto ou não

Compartilhar este post


Link para o post
Compartilhar em outros sites

E compreendeu a questão do dispositivo? Sobre não importar como alguma coisa vai acontecer?

 

Se conseguir compreender que a forma que alguma coisa vai acontecer é irrelevante, então você conseguirá compreender que, do ponto de vista da orientação a objetos, o que importa são os limites.

 

Por exemplo:

 

Abstração => Alguma coisa que pode matar o gato.

Concreção => Contador Geiger e um frasco de cianeto. Mas também pode ser uma bomba.

 

Abstração => DBMS (Sistema de Gerenciamento de Banco de Dados)

Concreção => MySQL, SQL Server, Oracle, DB2, etc.

 

Resumindo:

 

Abstração => Um conceito qualquer

Concreção => Qualquer aplicação desse conceito

Compartilhar este post


Link para o post
Compartilhar em outros sites

Esse papo tá muito abstrato pro meu gosto... :closedeyes:

Estão, goste ou não, estamos conseguindo alcançar o objetivo. Para compreender orientação a objetos, é fundamental pensar abstrato.

 

:D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Para compreender orientação a objetos, é fundamental pensar abstrato.

 

:joia:

 

O que falta para o tópico é um problema do mundo real. Bananas e batatas são úteis para explicar o conceito no início, mas depois de um tempo começam a atrapalhar e confundir os miolos.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tudo bem pessoal

 

Aproveitando esse tópico, poderei tirar minhas dúvidas sobre "classes abstratas" vamos lá:

 

classes+abstratas+e+concretas.png

 

1) Quando eu coloco classe abstract Funcionário estou querendo dizer abstrair características e comportamentos da classe Funcionário, para que suas subclasses(tipo: gerente, presidente, secretaria) herdam essas características e comportamento específico de Funcionário.
2) Nesse exemplo citei que a class funcionário é uma class abstract então não fazendo sentido nenhum ela ser instanciada, mas possa ser que exista outro sistema que a classe "funcionário" faça sentido ser instanciada, correto essa minha afirmação??

 

Bem vocês viram na ilustração da imagem, que a classe 'gerente' é concreta e a sua subclasse 'diretor' também é concreta.

E também vocês viram na imagem, que a classe 'secretaria' é abstrata e a suas subclasse 'secretariaAgencia' e 'secretariaAdministrativa' são concretas

 

 

3) Agora por que a classe 'secretaria' foi dada como abstrata e a classe 'gerente' é concreta (obs.: Sei que a utilidade da classe 'secretaria' foi declarada como abstrata, para que haja herança de comportamentos e características para as suas subclasses),

Mas não intendi o por que da classe 'gerente' é concreta e sua subclasse 'diretor' também é 'concreta'??

 

4) Em qual situação eu poderia instanciar 'gerente' e também instanciar a sua subclass 'diretor'?? class diretor é gerente?? gerente é um objeto diferente de diretor?? não intendi muito isso

Compartilhar este post


Link para o post
Compartilhar em outros sites

Classes abstratas têm a ver com reutilização de código. É dificílimo entender o porquê de uma classe abstrata, na maioria dos casos, com apenas um diagrama UML. É necessário ver o código para ver o que motivou a criação de uma classe abstrata.

 

No post #21, eu mostrei um caso de uso onde uma classe abstrata Programmer foi aplicada, apesar de um programador poder ser concreto. Novamente, é uma questão de necessidade e escolha.

 

1 - Sim, e também porque nessa classe abstrata contém um método abstrato (getBonificacao).

 

2 - É mais do que eu falei nesse post.

 

3 - Classes concretas podem herdar de classes concretas, não há necessidade de uma classe ser abstrata para haver herança.

 

4 - Não. Classe é diferente de objeto. Você está fazendo a mesma coisa se Gerente fosse abstrato. Uma classe abstrata difere-se de uma concreta porque uma classe abstrata só pode ser herdada, enquanto uma concreta pode ser tanto herdada quanto instanciada.

 

Há um problema nesse diagrama: Diretor não deveria estender Gerente, pois um diretor não é um gerente.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aproveitando o tópico: já me disseram que uma classe abstrata tem que - na maioria das vezes - implementar um ou mais métodos abstratos. Porém o que observo em minhas classes abstratas são que quase todas servem para tratar problemas de duplicação e de tipo não possuindo qualquer método abstrato.

 

No caso de não precisar fornecer implementação do método para as filhas prefiro usar interfaces - salvo se método for especialmente relevante para a classe abstrata. Me pergunto se estou pensando de maneira errada classes abstratas.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado por responder @Enrico Pereira

Há um problema nesse diagrama: Diretor não deveria estender Gerente, pois um diretor não é um gerente.


Eu tirei esse diagrama, nesse post http://www.caelum.com.br/apostila-java-orientacao-objetos/classes-abstratas/#funcionario3.png

 

3 - Classes concretas podem herdar de classes concretas, não há necessidade de uma classe ser abstrata para haver herança.


Por favor poderiam me dá um exemplo de instancia do tipo: laranja lima(concreta) >> laranja(concreta) >> fruta(abstrata)

 

No caso acima "laranja lima" pode ser instanciada e "laranja" também pode ser instanciada. qual o motivo de ter uma superclass concreta ?? Eu entendo que superclass serve para herança para as subclass. Tá certo esse meu pensamento??

Compartilhar este post


Link para o post
Compartilhar em outros sites
abstract class AbstractFruta{ }
class Laranja extends AbstractFruta{ }
class LaranjaLima extends Laranja{ }

 

No caso acima "laranja lima" pode ser instanciada e "laranja" também pode ser instanciada. qual o motivo de ter umasuperclass concreta ?? Eu entendo que superclass serve para herança para as subclass. Tá certo esse meu pensamento??

É tudo laranja, se eu quero chupar uma laranja, não importa de que qualidade seja, mais de repente eu vou fazer uma receita que precisa de laranja lima, ai eu vou pegar laranja lima, que não vai deixar de ser laranja, mais vai ser diferente das outras laranjas...

Compartilhar este post


Link para o post
Compartilhar em outros sites

qual o motivo de ter uma superclass concreta ??

 

Por exemplo eu posso ter a classe.

 

 

class Produto{
   public $preço;
   public $titulo;
   public $descrição;
   //funções...
}

Na minha loja virtual tenho produtos genéricos que precisam instanciados pela classe acima mas também tenho casos de aplicação específicos para certos produtos:

 

 

class CD extends Produto{
   public $artista;
   public $numerodefaixas;

  //funções...
} 
class Livro extends Produto{ 
 public $editora;
 public $autor;
 public $numerodepaginas;
   
  //funções...
}

Tanto o Cd quanto o livro são produtos e precisam ter características próprias que vão ser usadas no sistema, mas também preciso instanciar produtos genéricos que podem ser qualquer coisa e que não vão ser nem livros e nem cds...

Compartilhar este post


Link para o post
Compartilhar em outros sites
Obrigado pelas explicações @01100011cc e @Raoni Botelho Sporteman


Só para matar a minha dúvida sobre superclass concretas, vejam se o meu pensamento está correto

No meu sistema de receitas posso fazer:


* bolo de laranja (pode ser qualquer tipo de laranja)

* suco de laranja (pode ser qualquer tipo de laranja)


Mas pode ter momento no sistema de receita, que é presiso ser especifico num tipo de receita de laranja:


* bolo de "laranja lima" (tem que ser do tipo laranja lima se não vai da erro na receita)

* suco de "laranja pêra" (tem que ser do tipo laranja perâ se não vai da erro na receita)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bem, vamos lá.

 

O primeiro erro aqui é a obsessão por herança. Como diz o velho ditado, "Prefira composição ao invés de herança".

Herança não é, na maioria dos casos, algo legal (no sentido de ser um objetivo a ser alcançado). Só se faz herança quando há realmente necessidade.

 

De nada adianta você discutir e quebrar a cabeça pensando sobre uma laranja, enquanto se você for pegar um projeto com uma necessidade real e ficar parado pensando em laranjas.

 

Um classe é abstrata geralmente quando há a necessidade de um método abstrato e uma classe é concreta caso contrário.

Porém, sempre pense nos relacionamentos de objetos e nas interfaces ao invés de pensar nas classes abstratas. Classes abstratas estão relacionadas com comportamento, e comportamento em OO é apenas um detalhe (por isso o código OO deve ser abstrato).

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado pelas explicações @01100011cc e @Raoni Botelho Sporteman

 

Só para matar a minha dúvida sobre superclass concretas, vejam se o meu pensamento está correto

No meu sistema de receitas posso fazer:

 

* bolo de laranja (pode ser qualquer tipo de laranja)

* suco de laranja (pode ser qualquer tipo de laranja)

 

Mas pode ter momento no sistema de receita, que é presiso ser especifico num tipo de receita de laranja:

 

* bolo de "laranja lima" (tem que ser do tipo laranja lima se não vai da erro na receita)

* suco de "laranja pêra" (tem que ser do tipo laranja perâ se não vai da erro na receita)

Herança nada mais é do que uma especialização de outro objeto.

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Enrico Pereira

Você deu um exemplo no post #21 onde 'JuniorProgrammer' e 'SeniorProgrammer' tinham código duplicados,
então para resolver esse problema você criou a classe abstrata 'Programmer' e acabando com todo o código duplicado de 'JuniorProgrammer' e 'SeniorProgrammer'!

E você comentou que:

É raro, mas muito raro criarmos uma classe abstrata de primeira.


Então quando estivermos fazendo o nosso sistema e ver código duplicados, então ai que entra a ideia de colocar classes abstratas, para acabar com o código duplicado.

 

Colocando na classe abstrata os comportamentos e atributos em comum dessas classes com código duplicado e acabando com o código duplicado! este meu pensamento está correto??

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Enrico Pereira

 

Você deu um exemplo no post #21 onde 'JuniorProgrammer' e 'SeniorProgrammer' tinham código duplicados,

então para resolver esse problema você criou a classe abstrata 'Programmer' e acabando com todo o código duplicado de 'JuniorProgrammer' e 'SeniorProgrammer'!

 

E você comentou que:

 

Então quando estivermos fazendo o nosso sistema e ver código duplicados, então ai que entra a ideia de colocar classes abstratas, para acabar com o código duplicado.

 

Colocando na classe abstrata os comportamentos e atributos em comum dessas classes com código duplicado e acabando com o código duplicado! este meu pensamento está correto??

Não é o único cenário, mas é uma justificativa plausível.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.