Classes Abstratas - Má arquitetura?

8 respostas
MrDataFlex

Galera, estudando um pouco, vejam se estou errado:

Uma classe abstrata OBRIGA que todas as suas sub-classes CONCRETAS implemente TODOS os seus métodos abstratos!

Mas, há um erro, caso:

Tenho uma classe abstrata A no pacote p1, A possui os seguintes métodos:

abstract void metodoDePacote(); //default public abstract void metodoPublico();

Se minha classe B, no pacote p2 herdar de A. Dá pau! ¬¬ Pois, ela consiguirá implementar o metodoPublico, mas o compilador chora que há um método a ser implementado, porém como é fora de pacote, B não consegue enxergar!

Eaí, viajei muito? Em que sentido?? :smiley:

Agradeço galera…

8 Respostas

R

O correto é:

protected abstract void metodoDePacote();

[]´s

MrDataFlex

Mas este problema ocorre quando o método é default (TBM DE PACOTE!) e ainda me refiro a quando estão em pacotes diferentes (logo protected deixaria de ser de pacote e passaria a ser de herança!)

O correto não seria a sub-classe ignorar os métodos default, e implementar somente os que lhe dizem respeito a nível de acesso ?

R

Você tá querendo chupar cana e assoviar ao mesmo tempo.

Se o modificador é default, sua implementação tem q estar no pacote… se tiver fora é obvio que le não vai compilar.

[]´s

victorwss

Acho que o que ele quer é dizer isso:
Abstract + visibilidade default = coisa muito idiota a se fazer.

A menos que haja uma subclasse concreta no mesmo pacote da classe abstrata, combinar abstract e visibilidade deafult é pura imbecilidade. Mas mesmo assim o compilador não vai te impedir de fazer isso.

sergiotaborda

MrDataFlex:
Galera, estudando um pouco, vejam se estou errado:

Uma classe abstrata OBRIGA que todas as suas sub-classes CONCRETAS implemente TODOS os seus métodos abstratos!
(…)

Eaí, viajei muito? Em que sentido?? :smiley:

Mais ou menos. Se o método abstracto é nivel de pacote espera-se que a sua classe filha esteja no mesmo pacote.
Isso é correto e é utilizado. Não ha obrigação de tornar o método protected. Afinal o que vc está fazendo é protegendo o pacote não permitindo que aquela classe seja implementada fora dele.

Agora, se não era isso que vc queria, vc programou errado :wink:

LPJava

a class abstract somente obriga a PRIMEIRA classe concreta implementar seus metodos abstratos! nada mais! que isso…
Qualquer coisa pode se tornar uma “má arquitetura” depende mais de quem implementa e nao do recurso… em muitos casos o problema está nas pessoas, do que na tecnologia, recurso em si.

Spool

Tem que prestar atenção à regra de modificadores.

Se vc declarar um método com acesso default, só vai poder acessar esses método, seja para chamada ou implementação de onde as regras do modificador default permitir.

Se voce tentar compilar algo parecido com o cdigo que voce postou poderá verificar o erro mais detalhado:

This class must implement the inherited abstract method Teste.metodo1(), but cannot override it since it is not visible from Teste1. Either make the type abstract or make the inherited method visible	MyProject/src/test1

Portanto, voce só poderá extender uma classe com acesso default com uma classe que tenha as devidas permissões.

Até!

Spool

Lembre-se que eu posso sobrescrever qualquer metodo (com excessão de private) por qualquer outro com permissão de acesso mais liberal.

Até!

Criado 25 de fevereiro de 2008
Ultima resposta 25 de fev. de 2008
Respostas 8
Participantes 6