| Introdução
No artigo anterior falei sobre a programação orientada a objetos – POO que chamou a atenção dos programadores que utilizam técnicas tradicionais. A orientação a objetos ? OO possui 3 características que são o encapsulamento, a herança e o polimorfismo.
Neste artigo vou abordar sobre a herança no ColdFusion – CF.
A POO promove a definição de tipos (classes). As aplicações são construídas a partir da combinação dessas definições. Esta forma de desenvolvimento oferece benefícios em relação à abordagem estruturada tais como reutilização de código, melhor estruturação de aplicações e utilização de componentes de Software.
Herança é o principal recurso da POO, promovendo a reutilização de código. É um tipo de relacionamento que pode existir entre classes. Por exemplo: a classe funcionário é derivada da classe pessoa, pois um funcionário é uma pessoa, assim como o carro é um veículo e a internet é um meio de comunicação.
Comparando herança no CF e no Java
Classe pessoa em Java:
public class Pessoa {
private String nome;
private int idade;
public Pessoa() {
}
public Pessoa(String nome, int idade) {
this.nome = nome;
this.idade = idade;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public int getIdade() {
return idade;
}
public void setIdade(int idade) {
this.idade = idade;
}
public String toString() {
return “\nNome: “+nome+”\nIdade: “+idade;
}
}
Classe funcionário em Java:
// A classe funcionário é herdada da classe pessoa
public class Funcionario extends Pessoa {
// Atributos da classe funcionário
private double salario;
private String cargo;
// Construtor com parâmetros
public class Funcionario(double salario, String cargo, String nome, int idade) {
this.salario = salario;
this.cargo = cargo;
super(nome, idade);
// Aqui é construtor da classe pessoa, super se refere ao pai desta classe
}
// Métodos get e set
public void setSalario(double salario){
this.salario = salario;
}
public double getSalario() {
return salario;
}
public void setCargo(String cargo) {
this.cargo = cargo;
}
public String getCargo() {
return cargo;
}
// Método to String
public String toString() {
return (super.toString()+”\Cargo: “+cargo+”\nSalário: “+salario);
// Desta vez utilizo o super para chamar o método toString da classe pessoa que é o pai desta classe.
}
}
Programa em Java que acessa a classe pessoa:
public class Programa {
public static void main(String args[]){
Funcionario f = new Funcionario(300, “Estagiário”, “Renan Fretta”, 18);
System.out.println(f.toString());
}
}
Classe pessoa em CF:
<cfcomponent>
<cfset nome = “”>
<cfset idade = 0>
<cffunction name=”Init” access=”public”>
<cfargument name=”n” required=”true” type=”string”>
<cfargument name=”i” required=”true” type=”numeric”>
<cfset nome = n>
<cfset idade = i>
</cffunction>
<cffunction name=”getNome” access=”public” returntype=”string”>
<cfreturn nome>
</cffunction>
<cffunction name=”setNome” access=”public” >
<cfargument name=”n” required=”true” type=”string”>
<cfset nome = n>
</cffunction>
<cffunction name=”getIdade” access=”public” returntype=”numeric”>
<cfreturn idade>
</cffunction>
<cffunction name=”setIdade” access=”public” >
<cfargument name=”i” required=”true” type=”numeric”>
<cfset idade = i>
</cffunction>
<cffunction name=”toString1″ access=”public” returntype=”string”>
<cfreturn “<br>Nome: “&nome&”<br>Idade: “&idade>
</cffunction>
</cfcomponent>
Classe funcionário em CF:
<!— A classe funcionário é herdada da classe pessoa —>
<cfcomponent extends=”Pessoa”>
<!— Atributos da classe funcionário —>
<cfset this.salario = 0>
<cfset this.cargo = “”>
<!— Construtor com parâmetros —>
<cffunction name=”Init” access=”public”>
<cfargument name=”salario” required=”true” type=”numeric”>
<cfargument name=”cargo” required=”true” type=”string”>
<cfargument name=”nome” required=”true” type=”string”>
<cfargument name=”idade” required=”true” type=”numeric”>
<cfset this.salario = salario>
<cfset this.cargo = cargo>
<cfset super.Init(nome, idade)>
</cffunction>
<!— Métodos get e set —>
<cffunction name=”setSalario” access=”public”>
<cfargument name=”salario” required=”true” type=”numeric”>
<cfset this.salario = salario>
</cffunction>
<cffunction name=”getSalario” access=”public” returntype=”numeric”>
<cfreturn this.salario>
</cffunction>
<cffunction name=”setCargo” access=”public”>
<cfargument name=”cargo” required=”true” type=”string”>
<cfset this.cargo = cargo>
</cffunction>
<cffunction name=”getCargo” access=”public” returntype=”string”>
<cfreturn this.cargo>
</cffunction>
<!— Método toString —>
<cffunction name=”toString1″ access=”public” returntype=”string”>
<cfreturn super.toString1() & “<br>Cargo: ” & this.cargo & “<br>Salário: ” & this.salario>
</cffunction>
</cfcomponent>
Programa em CF que acessa a classe pessoa:
<html>
<body>
<cfoutput>
<cfobject name=”f” component=”Funcionario”>
#f.Init(300, “WEB Developer”, “Renan Fretta”, 18)#
#f.toString1()#
</cfoutput>
</body>
</html>
Considereções finais
Neste artigo consegui utilizar o comando this, deve-se referir sempre como this.atributo até mesmo na declaração do atributo: <cfset this.tributo = “” >
Agora vou explicar um pouco a teoria e a prática:
- Criei um objeto da classe Funcionario e instanciei de f :
<cfobject name=” f ” component=”Funcionario”>
Funcionario f = new Funcionario(300, ?WEB Developer?, ?Renan Fretta?, 18);
- Em Java como mostrei acima chamei o construtor com parâmetro automaticamente quando criei o objeto:
Funcionario f = new Funcionario(300, ?WEB Developer?, ?Renan Fretta?, 18) ;
- No CF o construtor não é executado automaticamente, eu tenho que chamá-lo normalmente como chamaria outro método qualquer.
<cfoutput># f.Init(300, ?WEB Developer?, “Renan Fretta”, 18) #</cfoutput>
- Funciona da seguinte maneira quando crio um objeto da classe funcionário estou dizendo que a instância é um funcionário. No nosso exemplo f é um funcionário. Agora você coloca um nome para o f , depois você coloca uma idade, salário e cargo para ele.
Então o nosso objeto f possui um nome, uma idade, um cargo e um salário, agora é só perguntar para ele:
Qual é o seu nome?
R: Basicamente f.getNome();
Qual é a sua idade?
R: Basicamente f.getIdade();
Qual o seu cargo?
R: Basicamente f.getCargo();
Qual o seu salário?
R: Basicamente f.getSalario();
Pera ai quero trocar meu nome:
R: Basicamente f.setNome(?João?);
Quero trocar minha idade:
R: Basicamente f.setIdade(21);
Quero trocar de cargo:
R: Basicamente f.setCargo(?Analista de Sistemas?);
Quero trocar de salário:
R: Basicamente f.setSalario(3000);
Você vai perguntar: Pera ai Renan! Eu não criei o método getNome, getIdade, setNome e setIdade na classe Funcionario isso não vai ocasionar um erro de execução?
R: Não. É esse o objetivo da herança promover a reutilização de código. Quando digo que uma classe é herdada de outra todos os métodos da classe pai se incorporam à classe filho automaticamente. Caso eu tenha um método com o mesmo nome na classe filho acontece uma sobrecarga, fazendo que o método da classe pai seja substituído pela da classe filho.
Você pode herdar uma classe de uma classe já herdada, por exemplo: classe avô, classe pai, classe filho, ou seja, animal, pessoa, funcionário. Um funcionário é uma pessoa e uma pessoa é um animal, o cachorro é um animal, ambos tem tipo (voador, terrestre), habitat, etc.
Caso tenha alguma dúvida utilize o fórum.
Abraços, Renan Fretta – renan@mxstudio.com.br |
Últimos Comentários