«

»

Sep 21

Print this Post

Forçando a implementação de um método em uma classe

Algumas vezes quando trabalhamos com arquitetura de softwares, ao se criar um padrão, visualizamos problemas que podem impedir que nossa arquitetura funcione direito e para evitar isso, muitas vezes devemos forçar o programador a utilizar o padrão correto.

Algumas vezes uma simples falta de implementação de um método pode gerar um problema.

Como exemplo disso, precisei forçar uma implementação de um determinado método, porém não poderia usar Interfaces, no máximo herança, ai implementei de uma forma que se o programador não implementasse um método, daria erro na aplicação.

Então resolvi compartilhar com os amigos.

O cenário é o seguinte, as classes da aplicação herdam sempre de uma classe base de um framework, nas implementações do framework existia a necessidade de um método que valida alguns recursos do sistema, porém esse método deve ser customizado, uma implementação diferente para cada processo, não teria como tê-lo como base. Precisava garantir que ele fosse implementado pelo desenvolvedor em todas as classes que herdam desta classe base.


Então como forçar que esse método fosse implementado?

A resposta é bem simples, se tivermos um método privado dentro da classe base e executarmos ele pelo método que executaria ele mesmo… no meu caso, o construtor da classe base. Quando o programador executar o construtor na classe filha, retornaria um erro informando que o método não foi encontrado.

Atentando para, se o método não for implementado na classe base, ocasionaria o mesmo problema, mas por convenção, é bom que o mesmo esteja presente na classe base.

Com isso, o programador é forçado a implementar o método na classe filha. Vamos a um exemplo básico para uma melhor compreensão.

Classe Base: PessoaBase.cfc

<cfcomponent output="false" displayname="PessoaBase">
	<cffunction name="init" access="package" returntype="void">
		<cfscript>
			this.gravarIdentificaoDoObjeto();
			
			this.nome = "";
			this.sobrenome = "";
			this.idade	= 0;
		</cfscript>
	</cffunction>
	
	<!---
		Este método precisa ser implementado na classe filha
	--->
	<cffunction name="gravarIdentificaoDoObjeto" access="private" returntype="void">
	</cffunction>	
</cfcomponent>

Classe Filha: Pessoa.cfc

<cfcomponent output="false" displayname="Pessoa" extends="PessoaBase">
	<cffunction name="init" access="public" returntype="Pessoa">
		<cfscript>
			super.init();
			
			return this;
		</cfscript>
	</cffunction>
	
	<cffunction name="gravarIdentificaoDoObjeto" access="public" returntype="void">
		<cfscript>
			this.uuid = CreateUUID();
		</cfscript>
	</cffunction>
	
	<cffunction name="gravarDadosPessoa" access="public" returntype="void">
		<cfargument name="nome" type="string" required="true" />
		<cfargument name="sobrenome" type="string" required="true" />
		<cfargument name="idade" type="numeric" required="true" />
		
		<cfscript>
			this.nome 	= arguments.nome;
			this.sobrenome 	= arguments.sobrenome;
			this.idade	= arguments.idade;
		</cfscript>
	</cffunction>
</cfcomponent>

Utilização da classe Pessoa: Index.cfm

<cfset variables.pessoa = CreateObject("component","modelos.Pessoa").init() />
<cfset variables.pessoa.gravarDadosPessoa("Paulo","Teixeira",33) />
<cfdump var="#pessoa#">

Conforme falei, o exemplo é bem simples, justamente para facilitar o entendimento. Testem sem implementar o método na classe filha e com a implementação.

Até a próxima.

Paulo Teixeira

Artigo original

 

Permanent link to this article: http://ensina.me/coldfusion/forcando-a-implementacao-de-um-metodo-em-uma-classe/

Leave a Reply