Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Forçar implementação de método


Rafael Laurindo

Pergunta

Agora é que são elas !!!

Function.prototype.isEmpty = function () {
     return this.toString() == function(){}
 }

 Interface = {
     
     iface : function()
     {
         if (this.constructor == Interface.iface.prototype.constructor)
             throw 'can\'t instantiate interfaces'
         
         //sem o {}, como no PHP, da erro
         this.method1 = function(){}
         this.method2 = function(){}
         
         for(att in this)
             //Foi necessário esta verificação, porque não existe isEmpty em outro objeto, senão em Function
             if(typeof this[att] == 'function')
                 if (this[att].isEmpty())
                     throw 'You must implement the method ' + att
          /**/
     },
     
 }

 Class = {

     cls : function()
     {
         Interface.iface.call(this)
         this.property = 'public property'
     }
     
 }

 cls = new Class.cls()

Gostaria que a saída de erro fosse you must implement the method2. Já que o mesmo não foi implementado em Class. Mas a saída de erro, está sendo "you must implement the method1", e o mesmo está sendo implementado em Class. Eu sei porque está acontecendo, mas não sei como resolver. Alguém quer dar um palpite?

Editado por Rafael Laurindo
Link para o comentário
Compartilhar em outros sites

8 respostass a esta questão

Posts Recomendados

  • 0

O Javascript avisa que o método method1 não foi implementado porque no momento da herança o método realmente ainda não foi definido (acho que isso você já sabe).

A solução seria mover o código que realiza a herança para o fim da classe cls:

Class = {

    cls : function()
    {
        this.property = 'public property'
        //fazendo o overhide em method1
        this.method1 = function(){
            alert('')
        }
        //aplicando herança
        Interface.iface.call(this)
    } 
}
No entanto, isso ainda não funciona porque o método é definido em cls com um corpo e depois redefinido em iface como vazio. A solução é somente definir o método como vazio somente se ele ainda não foi definido:
if(!this.method1) //Verifica se está definido
{
    this.method1=function(){}
}
if(!this.method2) //Verifica se está definido
{
    this.method2=function(){}
}

Link para o comentário
Compartilhar em outros sites

  • 0

E onde deve ser colocado esse último código que mandou?

if(!this.method1) //Verifica se está definido

{

this.method1=function(){}

}

if(!this.method2) //Verifica se está definido

{

this.method2=function(){}

}

Editado por Rafael Laurindo
Link para o comentário
Compartilhar em outros sites

  • 0

Bom, então, no final, tudo ficou assim:

Function.prototype.isEmpty = function () {
    return this.toString() == function(){}
}

Abstract = {
    
    abt : function()
    {
        //Coloca a classe como private, verificando se o construtor informado no new é o construtor da classe
        if (this.constructor == Abstract.abt.prototype.constructor)
            throw 'can\'t instantiate interfaces'
        
        //verifica se já foi definido anteriormente. Sendo definido na classe que implementa essa interface, ele não será redefinido quando chamado
        if(!this.method1) this.method1 = function(){}
        if(!this.method2) this.method2 = function(){}
        
        for(att in this)
            if(typeof this[att] == 'function') //Foi necessário esta verificação, porque não existe isEmpty em outro objeto
                if (this[att].isEmpty())
                    throw 'You must implement the method ' + att
        /**/
    },
    
}

Class = {

    cls : function()
    {
        this.property = 'public property'
        //fazendo o overhide em method
        this.method1 = function(){
            alert('')
        }
        //implementar uma função com nome implements para fazer isso
        Abstract.abt.call(this)
    }
    
}

cls = new Class.cls()

Valeu, mais uma vez Jonathan. Abs.

Editado por Rafael Laurindo
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...