Cita:
Iniciado por GatorV
Pues si te fijas tu método abstracto se llama caculate, cuando el método que estas sobreescribiendo es calculate.
Saludos.
OHHHHHHHHHHHH! :ojote:
Que buen ojo!
PD: la clase sirve para realizar calculos de medias moviles simples y exponeciales de forma eficiente pues permite alterar el ultimo valor y no es necesario recalcular desde el principio (quien la necesite...ya sabe)
Código PHP:
<?
/*
MEDIAS MOVILES
metodos: add, reset, setN, setNesimo, caculate, unDo (deshace el ultimo calculo)
*/
// superclase
abstract Class Media {
protected $n;
protected $arr = array();
protected $arrSize;
protected $calculo =null;
protected $calculoAux=null; // guarda valor anterior
function __construct ($n){
$this->setN($n);
}
// usar solo despues... de tener el arreglo "lleno" !!
function setNesimo ($val){
$this->arr [($this->n) - 1]=$val;
}
function unDo (){
$this->calculo = $this->calculoAux;
}
# puede ser protected porque el usuario no la llama directamente
protected function saveCalc(){
$this->calculoAux = $this->calculo;
}
function reset(){
unset ($this->arr);
$this->arrSize=0;
$this->n=0;
$this->calculoAux=null;
$this->calculo =null;
}
// agrega a $rb los elemenos de $this->arr
protected function add_array(array $rb){
foreach ($rb as $val){
$this->arr[] = $val;
}
}
function add($data) {
if (is_array($data)){
$this->add_array ($data);
}else{
$this->arr[] = $data;
}
$this->arrSize = count ($this->arr);
}
function setN($n){
$this->n = $n;
}
abstract protected function calculate(); // debe ser abstracta igual que la clase!!!
} // fin
Class MediaSimple extends Media {
/*
// hace falta si el constructor es "protected" en la clase padre
function __construct ($n){
parent::__construct($n);
}
*/
private function summ(){
$res=0;
for ($i=0;$i<$this->arrSize;$i++){
$res = $res + $this->arr[$i];
}
return $res;
}
public function calculate(){
$this->saveCalc;
$this->calculo = ($this->summ ($this->arr)/$this->n);
return ($this->calculo);
}
}
Class MediaExponencial extends Media {
function __construct ($n){
if ($n==null) $n=0;
parent::__construct($n);
}
/*
public function setEma ($ema){
$this->calculo = $ema;
}
*/
public function calculate(){
$this->saveCalc();
$k = (2 / ( $this->n + 1));
if ($this->calculo==0)
$this->calculo = $this->arr[0];
for ($i=0;$i<$this->n;$i++){
$this->calculo = $this->calculo + (($this->arr[$i] - $this->calculo) * $k);
}
return ($this->calculo);
}
}
?>