Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Duvida sobre a classe pai

Boa noite, tudo bem?

Estou com uma duvida com relação a herança. É o seguinte, eu tenho a classe pai Produto, com os atributos comuns a todos e, tenho também a classe filha chamada Livro desta forma:

class Produto{
    private $nome;
    private $preco;
    private $descricao;
    private $usado;
    private $categoria

    //getters, setters e demais funções.
}
class Livro extends Produto{
    private $isbn;

    //getters e setters.
}

Bom, definindo a regra de negócio que categoriza cada produto como tal, eu tenho uma instância do DAO para gerencia dos dados e da classe Livro para criação do objeto a ser utilizado pela DAO da seguinte maneira:

$produtoDao = new ProdutoDao($conexao);

$produto = new Livro($nome, $preco, $descricao, $usado, $categoria);
$produto->setIsbn($isbn); //Recebido por $_POST['isbn'] e atribuído a $isbn. //ISSO É DA CLASSE HERDEIRA!

$produtoDao->insereProduto($produto);

Agora, ao adicionar este objeto da classe Livro utilizando a função insereProduto, os parâmetros estabelecidos nela me deixaram confuso. Vejam como está:

class ProdutoDAO{
    //demais funções

    function insereProduto(Produto $produto){ // AQUI ESTÁ MINHA DUVIDA
        //Regra de negocio
    }

    //demais funções

Eu estou recebendo como parâmetro um tipo Produto e, esse Produto ( pensando dentro da classe ) não possui o atributo isbn. Porém, eu consigo dar um echo em $produto->getIsbn() dentro do método insereProduto.

O que acontece aqui? Quando temos a passagem de um atributo da classe filha, que não existe na classe pai, por meio de um método que recebe como parâmetro a classe pai, ele é criado dentro desta?

Em outras palavras, neste exemplo é como se a classe Produto ganhasse o atributo isbn?

Um abraço.

1 resposta
solução!

Oi Vitor, tudo bem? Essa é uma excelente pergunta, que não envolve apenas herança no caso. O que acontece é que sim, você esta se referindo a um livro como se fosse um produto, e na herança, só pra lembrar, esse relacionamento é do tipo é um, ou seja, um livro é um produto por herdar dessa classe.

Porém, o que pode acontecer também nestes casos é que, por polimorfismo, você pode referenciar um livro como um produto, mas não o inverso. Quando o interpretador da linguagem lê o código ele vê que, embora você esteja se refereciando a um produto, aquele objeto, por baixo dos panos é um Livro. E por isso tudo isso funciona.

Pegou a ideia? O nome do conceito que você está enfrentando ai é esse tal de polimorfismo. Quer testar? Esperimente trocar o parâmetro para receber um Livro ao invés de um produto e passe um produto como argumento. Terá um erro :) (deverá ter)

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software