Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Pessoal, tenho uma classe que precisa ser abstrata e sei que vou criar uma infinidade de outras classes que seguem o mesmo modelo dela (inclusive sendo abstratas) por isso eu gostaria de implementar uma interface nelas para que tenham sempre a mesma estrutura básica. Entretanto, mesmo que nenhum erro seja exibido, o php não obriga a classe a ter os mesmos métodos que foram implementados na interface, apenas quando tiro o abstract dela. Alguma idéia? O que quero é possível?
Ex:
abstract class Disposivos implements DAO{...}
Ola amigo, se entendi bem, eu não vou poder fazer isso uma vez que minhas classes abstratas nunca serão declaradas.
Isso porque elas são fábricas que uso assim:
$Dispositivo = Dispositivos :: getPorId ( 10 );
No caso o Dispositivos implementaria uma interface que ditaria os métodos obrigatórios a todas as fabricas.
Mas pelo que entendi, isso não é possível. Uma pena.
Vou procurar alguma outra maneira de garantir de não me esquecer de manter os métodos em todas as fábricas.
Muito obrigado de coração e corrija-me se tiver enganado.
perdao, mas nao entendi este seu segundo post...
Imagina que eu tenho uma classe DAO que representa uma tabela de dispositivos no banco de dados.
class Dispositivo extends DAO {...}
Até ai esta td ok e não tive problemas, meu problema começa na fábrica de objetos.
abstract class Dispositivos
{
public function getPorId($id){...}
public function getLista($inicio,$fim){...}
}
O Dispositivos é apenas uma fábrica, terá muitas outras para Configuracoes, Modulos e etc... Todas elas terão os mesmos métodos que serão implantados de forma diferente, mas TODAS elas devem ser abstratas para que eu possa usar assim
Dispositivos :: getPorId ( );
Ao invés de ser obrigado a isso:
$Dispositivos = new Dispositivos ( );
$Dispositivo = $Dispositivos -> getPorId ( );
O que fugiria um pouco do conceito de fábrica...
ah sim, na verdade você trocou os nomes, o q você ker fazer nao eh abstrato, e sim estatico
leia
http://br.php.net/manual/pt_BR/language.oop5.paamayim-nekudotayim.php
http://br.php.net/manual/pt_BR/language.oop5.static.php
http://br.php.net/manual/pt_BR/language.oop5.abstract.php
na ordem...
Opa amigo!
Realmente você esta coberto de razão... eu sempre usei a maneira que descrevi acima para fazr oq quero e não sabia desta forma (static) que realmente parece ser muito melhor e atender perfeitamente as minhas necessidades.
É interessante reparar como é possível crescer tanto em certos aspectos e continuar leigo sobre coisas tão básicas como isso... Vou implementar o static em meu sistema e acredito que isso resolverá definitivamente o problema.
Novamente muito obrigado (por me mostrar uma saída e por corrigir este erro que eu tinha em minha cabeça sobre abstract)
pois eh,
quanto mais conhecemos, mais conhecemos que nao conhecemos.
veja bem,
o metodos declarados na interface obriga a classe q a implementa q crie os metodos declarados na interface, os metodos abstratos agem da mesma forma, podes ver q um metodo abstrado nao eh escrito, apenas declarado, assim como numa classe q implementa uma interface, uma classe q herda uma classe abstrata deve implementar os metodos abstratos
interface Cortante
{
interface Alimento
{
class Faca implements Cortante
{
public function cortar(Alimento $alimento)
{
class Pao implements Alimento
{
public function setNome()
{
a mesma coisa acontece com o as classes abstratas, se você criar uma interface com o metodo A, e implementar numa classe abstrata q tem um metodo abstrato A, nao dara erro, pois o metodo continua abstrato, você tem de q escrever este metodo na classe (nao abstrata) q ira implementar ou a interface ou a classe abstrata.
ou seja, a interface diz q metodos um objeto deve ter, por isso so podem der declarados publicos, ja a classe abstrata, so pq nao sera instanciada diretamente significa q ela nao possa ter outros metodos, no caso ae vem os metodos protegidos, q sao metodos q podem ser usados na propria classe ou classes filhas, e os metodos private , somente usados na propria classe..bom...minha opiniao...