Ir para conteúdo

POWERED BY:

Arquivado

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

falcao544

[Resolvido] Método Abstrato - Para que serve?

Recommended Posts

Uma interface é importante para especificar as operações esperadas em um CONJUNTO de objetos. Se o objeto é único na aplicação, não possui nem similares, então não tem porque definir uma interface.

 

Vlw, Realmente! Quando estava começando a ver isso, um conhecido meu disse que eu só usaria interfaces quando tivesse muitos objetos. E faz sentido, pois se meu sistema tem apenas um objeto, não há muito o que abstrair.

Mas dai vem a questão da modificação futura, que as vezes é bom abstrair antes, para caso um novo objeto ter que ser integrado ao sistema, bastaria implementar tal interface e concretizar os métodos na classe. Isso é mais um recurso da utilização de interfaces né? Reutilização?

 

edit--

 

A tempo percebo que esses conceitos não são definidos de forma simples, existem muitos e variados casos que devemos aplicar certos conceitos no nosso sistema.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você tem que analisar se REALMENTE existe a possibilidade de existirem outros objetos para a mesma função.

Eu gosto de usar o toyotismo para isso: produzo só quando preciso.

Caso contrário, vai criar um elefante branco.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Caramba, você tem razão! Tudo questão de análise!

Valeu mesmo! :D

 

Já criei elefante branco, mas fazer o que... :(

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom pessoal, como prometido, eu voltei :) ! Li e re-li tudo que escreveram, e só tenho a agradecer, pois as explicações são de excelente qualidade!

 

Bom, aqui vou eu:

Seguindo o exemplo que dei acima, você teria algo como:

<?php
abstract class Pessoa {
       protected $nome;
       protected $maoDireita = 'Mão Direita';
       protected $maoEsquerda = 'Mão Esquerda';

       public function getNome() {
               return $this->nome;
       }

       abstract public function escreverRedacao();

       public function __construct($nome) {
               $this->nome = $nome;
       }
}

class Destro extends Pessoa {
       public function escreverRedacao() {
               echo "Escrevendo redação com a " . $this->maoDireita;
       }
}

class Canhoto extends Pessoa {
       public function escreverRedacao() {
               echo "Escrevendo redação com a " . $this->maoEsquerda;
       }
}

$pessoa = new Pessoa("Zé"); // Erro

$voce = new Destro("falcao544");
$jimmy = new Canhoto("Jimmy Hendrix");

$voce->escreverRedacao(); // Mostra: Escrevendo redação com a Mão Direita
$jimmy->escreverRedacao(); // Mostra: Escrevendo redação com a Mão Esquerda
?>

 

O método mágico "__construct" é executado por causa do "extends"? É como se o extends fizesse o __construct inicializar assim como ele é inicializado quando criamos uma instância de uma classe que tem um método __construct?

 

Nessa parte:

<?php
class Box implements Serializable {

$voce = new Destro("falcao544");
$jimmy = new Canhoto("Jimmy Hendrix");
?>

 

É a mesma coisa que fazer isso?

<?php
$voce = new Pessoa("falcao544");
?>

 

Eu sei que isso não pode pois a classe é abstrata, mas consederem a classe como public! (uma classe pode ser algo além de public ou abstract?)

 

 

<?php
<?php
class Box implements Serializable {
?>

 

extends é para classes e implements é para interfaces? É essa a diferença?

 

Uma outra dúvida bastante comum é: onde eu uso classes abstratas e onde eu uso interfaces?

 

Uma classe abstrata tém o método, mas não o define, deixando essa tarefa às classes filhas. É isso?

Enquanto que uma interface define o método, e as classes só o utilizam como foi definido pela interface?

 

Como crio uma interface?

 

É possível que essa funcionalidade seja requerida em vários objetos sem nenhuma relação entre sí? Ou ela é aplicável somente a um conjunto bem definido de classes que se relacionam por herança?

Se a sua situação é a primeira, utilize interfaces, se é a segunda, utilize classes/métodos abstratos.

Essas classe que se relacionam, é uma classe pai com classes filhas, com essas classe filhas não se relacionando? Ou seja, elas apenas herdam a classe pai, mas não interagem entre si? Ou elas não só herdam a classe pai, como também interagem entre si?

 

 

As classes filhas devem implementar os métodos declarados na classe-pai provendo um um recurso esperado que, normalmente, a própria classe-pai vai utilizar:

 

<?php

abstract class Employee {

   protected $salary;

   public function __construct() {
       $this -> salary = $this -> defineSalary();
   }

   public function getSalary() {
       return $this -> salary;
   }
}

class Teacher extends Employee {

   public function defineSalary() {
       return 1000;
   }
}

class Principal extends Employee {

   public function defineSalary() {
       return 2000;
   }
}

$teacher = new Teacher;
$principal = new Principal;

var_dump( $teacher -> getSalary(), $principal -> getSalary() ); // 1000 e 2000

 

Herança é recíproca? Ou seja tanto a classe filha pode usar os métodos da classe pai, assim como a classe pai pode usar os métodos da classe filha?

 

Por enquanto é só! Muito Obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites
O método mágico "__construct" é executado por causa do "extends"? É como se o extends fizesse o __construct inicializar assim como ele é inicializado quando criamos uma instância de uma classe que tem um método __construct?

 

Não, o método __construct (chamado de construtor) é invocado sempre que você cria um objeto daquela classe através do operador new.

Quando você não declara um construtor, o próprio PHP cria um construtor vazio pra você.

 

Eu sei que isso não pode pois a classe é abstrata, mas consederem a classe como public! (uma classe pode ser algo além de public ou abstract?)

Se não pode, não é a mesma coisa :thumbsup:.

No PHP não existe o conceito de classe public... Só existem classes concretas e abstratas...

 

extends é para classes e implements é para interfaces? É essa a diferença?

Isso...

 

Uma classe abstrata tém o método, mas não o define, deixando essa tarefa às classes filhas. É isso?

Enquanto que uma interface define o método, e as classes só o utilizam como foi definido pela interface?

 

Como crio uma interface?

Não, calma lá...

Uma classe abstrata deve ter ao menos um método abstrato, deixando sua implementação para as classes filhas concretas.

 

Uma interface é declarada do mesmo jeito que uma classe, mas com a palavra-chave interface:

interface Serializable {

public function serialize();

public function unserialize($serial);

}

 

Essas classe que se relacionam, é uma classe pai com classes filhas, com essas classe filhas não se relacionando? Ou seja, elas apenas herdam a classe pai, mas não interagem entre si? Ou elas não só herdam a classe pai, como também interagem entre si?

Todas as classes que derivam de uma mesma classe são relacionadas a ela por herança... Não importa se interagem entre si ou não...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Isso...

 

Esse isso ai em cima é de "isso mesmo" ou ta faltando algo mais para complementar o meu conceito?

 

 

sobre o método __construct, como ele é chamado no exemplo abaixo? Ele é chamado quando eu crio uma instancia da classe que herda a classe que tem aquele __construct?

<?php
abstract class Pessoa {
        protected $nome;
        protected $maoDireita = 'Mão Direita';
        protected $maoEsquerda = 'Mão Esquerda';

        public function getNome() {
                return $this->nome;
        }
        
        abstract public function escreverRedacao();
        
        public function __construct($nome) {
                $this->nome = $nome;
        }
}

class Destro extends Pessoa {
        public function escreverRedacao() {
                echo "Escrevendo redação com a " . $this->maoDireita;
        }
}

class Canhoto extends Pessoa {
        public function escreverRedacao() {
                echo "Escrevendo redação com a " . $this->maoEsquerda;
        }
}

$pessoa = new Pessoa("Zé"); // Erro

$voce = new Destro("falcao544");
$jimmy = new Canhoto("Jimmy Hendrix");

$voce->escreverRedacao(); // Mostra: Escrevendo redação com a Mão Direita
$jimmy->escreverRedacao(); // Mostra: Escrevendo redação com a Mão Esquerda
?>

 

Quando eu intancio uma classe assim:

<?php
$objeto = new classeTeste("falcao544");
?>

 

Como eu recebo esse valor "falcao544" na classe?

 

Obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Esse isso ai em cima é de "isso mesmo" ou ta faltando algo mais para complementar o meu conceito?

 

Talvez. Você deveria pensar assim: Bom, se eu tenho uma interface criada, e quero usa-la na minha classe, então eu terei que concretizar a definição dessa interface, já que, ela apenas cria, digamos, o esqueleto de uma classe, ou seja, irei IMPLEMENTA-LA, e consequentemente, usarei implements. Já se eu tiver uma CLASSE, independente de ela ser uma classe concreta ou abstrata, usarei extends, por que? Porque primeiramente uma classe não é uma interface, e segundo que uma classe tem membros, e já que ela tem membros, eu posso herdar isso (exceto membros privados).

Sim, uma classe abstrata pode ser que tenha apenas métodos abstratos, e nesse caso eu não herdaria nada, apenas implementaria esses métodos na classe que extendesse ela. Nesse caso, seria mais correto usar uma interface para isto.

 

$pessoa = new Pessoa("Zé"); // Erro

 

Apesar de lançar erro, você pode usar o construtor definido numa classe abstrata, chamando ele por uma classe que herde essa classe abstrata. Então se eu tivesse uma classe Trabalhador que herdasse essa classe abstrata Pessoa e no construtor dessa classe Pessoa eu chamasse isso

 

parent::__construct();

 

não lançaria um erro.

 

Quando eu intancio uma classe assim:

 

<?php
$objeto = new classeTeste("falcao544");
?>

 

Como eu recebo esse valor "falcao544" na classe?

 

O valor "falcao544" nesse caso, seria passado como parâmetro de entrada para o construtor dessa classe. Veja o construtor da classe Pessoa, tem um parâmetro $nome que será passado para esse construtor e será atribuído para um campo dessa classe, isso é, $this->nome. Lembre-se que o $this é para se referenciar ao objeto corrente, ou seja, o objeto que chamou a instância de uma classe com o operador new.

Compartilhar este post


Link para o post
Compartilhar em outros sites
Uma classe abstrata deve ter ao menos um método abstrato, deixando sua implementação para as classes filhas concretas.

Não, não.

 

Uma classe abstrata não precisa ter nenhum método abstrato, porém a recíproca não é verdadeira, isto é, se uma classe tiver ao menos um método abstrato ela DEVE ser declarada como abstrata.

 

Esse tipo de flexibilidade é importante principalmente quando várias classes implementam várias interfaces e, pelo menos no meu caso, estendem de um mesmo objeto base, assim evita-se repetir o mesmo extends e todas as interfaces em cada uma das classes.

Compartilhar este post


Link para o post
Compartilhar em outros sites
Não, não.

 

Uma classe abstrata não precisa ter nenhum método abstrato, porém a recíproca não é verdadeira, isto é, se uma classe tiver ao menos um método abstrato ela DEVE ser declarada como abstrata.

 

Esse tipo de flexibilidade é importante principalmente quando várias classes implementam várias interfaces e, pelo menos no meu caso, estendem de um mesmo objeto base, assim evita-se repetir o mesmo extends e todas as interfaces em cada uma das classes.

 

Olha, eu realmente não me lembro se podemos fazer isso com PHP, mas com Java, a classe declarada como abstrata deve possuir ao menos um método abstrato...

Lembrando que, ao implementar uma interface, sem implementar seus métodos, você, na prática passa a ter métodos abstratos...

 

Mas pensando bem, esses dias eu criei uma classe abstrata somente com métodos estáticos e funcionou... então realmente deve ser possí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.