CAPÍTULO 8
Programação visual com Software Livre
EDIT LIN EDITORIAL S.L,  dos autores  Daniel Campos Fernández e José Luis Redrejo.  Prólogo de Benoit Minisini

<< Anterior Próximo >>


Modificando Funcionalidades

    

Até agora temos duas classes, uma das quais tem uma propriedade adicional Count, continua sendo pouco útil já que poderíamos, sem mais, haver adicionado essa funcionalidade a classe original ClsCalculo, evitando mantermos duas classes diferentes. Vamos agora explorar o verdadeiro potencial do conceito de Herança, e as possibilidades de substituir os métodos e propriedades originais por novas implementação que dão lugar a resultados distintos: neste caso, a nova classe, quando o método Avarage é chamado, apagará todos os elementos da matriz para ficar em branco. Desta forma, teremos duas classes com diferente funcionalidade partindo de uma base comum: os objetos da classe pai acumula números sem fim, enquanto que após cada chamada a Avarage os limpa e começa tudo do zero.
 

A classe ClsCalculo2 fica assim:
 

' Gambas class file

INHERITS ClsCalculo

PROPERTY READ Count AS Integer

PRIVATE FUNCTION Count_Read() AS Integer

RETURN SUPER._Numbers.Count

END

PUBLIC FUNCTION Average() AS Float

DIM Nm AS Float

DIM Vl AS Float

DIM Total AS Integer

IF SUPER._Numbers.Count = 0 THEN RETURN 0

FOR EACH Vl IN SUPER._Numbers

Nm += Vl

Total += 1

NEXT

SUPER._Numbers.Clear()

RETURN Nm / Total

END
 
Agora existe um método Average dentro de ClsCalculo2, e este método substituem na classe filho o método Average do pai. Quando chamamos o método Average de um objeto da classe ClsCalculo2, o interpretador não chamará a função original do pai, e sim a implementação da classe filho.

Modificamos a função Main() e testamos esse novo código para comprovar os resultados
 

PUBLIC SUB Main()

DIM Calculo AS NEW ClsCalculo2

Calculo.add [ 12.5 ]

Calculo.add [ 23.6 ]

Calculo.add [ 7.5 ]

PRINT "Elementos: " & Calculo.Count & " -Média: " & calculo.Average ()

Calculo.add [ 17.5 ]

Calculo.add [ 31.8 ]

PRINT "Elementos: " & Calculo.Count & " -Média: " & calculo.Average ()

END
 

Como resultados, obteremos no console duas linhas que mostra o funcionamento da nova classe:
 

Elementos: 3 – Média: 14.6

Elementos: 2 – Média: 24.65
 

Se  a primeira linha de Maina() definirmos que o objeto Calculo pertence a classe pai ClsCalculo, eliminamos o uso de count, que não existe na classe pai, e voltamos a executar o programa, observamos claramente a diferença:
 

PUBLIC SUB Main()

DIM Calculo AS NEW ClsCalculo

Calculo.add [ 12.5 ]

Calculo.add [ 23.6 ]

Calculo.add [ 7.5 ]

PRINT " -Média: " & calculo.Average ()

Calculo.add [ 17.5 ]

Calculo.add [ 31.8 ]

PRINT " -Média: " & calculo.Average ()

END
 

Elementos: 3 – Média: 14.6
Elementos: 2 – Média: 24.65
 

Neste caso, se calcula primeiro a média dos três primeiros números e depois a média dos cinco números:
Podemos aproveitar mais da herança, empregando a palavra SUPER que vimos anteriormente. A classe original ClsCalculo já tem o código necessário para calcular a média, e na classe filha ClsCalculo2 se necessitarmos apagar os elementos da matriz uma vez calculada a média.

Podemos, então, modificar o código da nova função Average, para que chame a original e depois apague os elementos, poupando, como sempre, tempo e código:
 

' Gambas class file

INHERITS ClsCalculo

PROPERTY READ Count AS Integer

PRIVATE FUNCTION Count_Read() AS Integer

RETURN SUPER._Numbers.Count

END

PUBLIC FUNCTION Average() AS Float

DIM Nm AS Float

Nm = SUPER.Average()

SUPER._Numbers.Clear()

RETURN Nm

END
 

A nova função Average agora se limita a chamar a original, utilizando a classe pai, para armazenar esse valor, apagar os elementos da matriz e devolver o valor.
 









           

<< Anterior Próximo >>

HOME



Cópia literal

Extraído do livro “GAMBAS, programação visual com software Livre”, da editora EDIT LIN EDITORIAL S.L,  dos autores  Daniel Campos Fernández e José Luis Redrejo. Prólogo de Benoit Minisini

LICENSA DESTE DOCUMENTO


É permitido a cópia e distribuição da totalidade ou parte desta obra sem fins lucrativo. Toda cópia total ou parcial devera expressar o nome do autor e da editora e incluir esta mesma licença, adicionando se é uma cópia literal “Cópia literal”. Se é autorizada a modificação e tradução da obra  sem fins lucrativo sempre se deve constar na obra resultante  a modificação o nome da obra original o autor da obra original e o nome da editora e a obra resultante também deverá ser livremente reproduzida, distribuída, ao publico e transformada em termos similares ao exposto nesta licença.

Tradução

Cientista
 (Antonio Sousa)