Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Uma superclasse pode acessar os métodos de uma subclasse livremente?

Bom, eu vi no exercício que a classe Produto é superclasse da classe abstrata Livro que por sua vez é superclasse das classes LivroImpresso e Ebook. Tipo assim:

class Produto {}

abstract class Livro extends Produto {}

class LivroImpresso extends Livro {}

class Ebook extends Livro {}

A dúvida surgiu quando no exercício o instrutor acessou um método declarado dentro da classe Ebook no escopo da classe Produto. Assim:

if($this->temWaterMark()) {
            $this->setWaterMark($parametros["watermark"]);
}

Isso quer dizer que Produto enquanto superclasse pode acessar todos os métodos escritos em suas classes filhas mas as classes filhas não podem acessar diretamente os métodos de produto?

A dúvida é besta mas foi só uma observação que eu fiz e queria ter certeza porque o instrutor não falou nada sobre o acesso desses métodos na aula.

Obrigado.

2 respostas
solução!

Oi Luiz, tudo bom?

Acredito que vc tenha deixado passar um detalhe:

// resto da classe produto
public function temTaxaImpressao() {
    return $this instanceof LivroFisico;
}

public function temWaterMark() {
    return $this instanceof Ebook;
}

Aqui estamos dizendo que se o produto for uma instancia de Ebook, então ele tem waterMark. Percebe que o método existe na classe produto, por isso você conseguiu acessar.

Isso quer dizer que Produto enquanto superclasse pode acessar todos os métodos escritos em suas classes filhas mas as classes filhas não podem acessar diretamente os métodos de produto?

Na verdade o que ocorre é o contrario. A classe Produto enquanto superclasse não tem como adivinhar o que suas classes filhas tem. Já as classes filhas podem acessar tudo que é publico/protegido de suas classes mãe(super classe).

Qualquer duvida, compartilha com a gente!

Abraço e bons estudos =)

Bom dia Luiz Eduardo,

Em Orientação a Objetos, no tema Herança, uma subclasse herda da superclasse, logo tem acesso ao que sua classe mãe oferece (atributos e métodos), não o contrário.

Exemplificando o conceito fora de qualquer linguagem: Se tenho a superclasse Animal, e as subclasses Gato e Cachorro. Animal possui um método abstrato produzirSom(), e um método concreto chamado correr(). As filhas de Animal devem implementar produzirSom() obrigatoriamente, e herdam o comportamento padrão correr(). Um cachorro implementa produzirSom() latindo, e um gato implementa miando. Ambos tanto Cachorro como Gato, correm. Agora imagine que o Gato tem um comportamento próprio dele, que é o ronronar (aquele barulho que os gatos fazem sabe). A superclasse Animal não tem conhecimento nenhum sobre tal comportamento de sua filha Gato,e não consegue usá-lo de forma nenhuma.

Uma coisa que será possível é criar uma referência do tipo da superclasse, e usá-la para referenciar um objeto do tipo da subclasse, por exemplo:

Animal gato = new Gato();
Animal cachorro = new Cachorro();

Isso é possível devido a outro grande conceito da OO, o Polimorfismo. Isso dá certo, porque Gato É UM Animal, Cachorro É UM Animal. Com isso, será possível chamar o seguinte:

gato.ronronar();

Mas porque isso dará certo, se a referência é do tipo Animal, e Animal não tem ronronar? Porque a instância do Objeto é do tipo Gato, e este tem o método que chamamos.

Resumindo: Um subclasse pode ser referenciada pela sua superclasse, e conhecerá tanto os membros de sua mãe como seus próprios. Mas a superclasse não conhecerá os membros de seus filhos, ela poderá deixar de herança para eles os membros que ela possuir, mas não usar o que seus filhos possuem que é só deles.

Abraços.