Foros del Web » Programando para Internet » PHP »

metodo abstracto sin implementar ???

Estas en el tema de metodo abstracto sin implementar ??? en el foro de PHP en Foros del Web. Buenas!!! PHP me dice que.... Cita: Fatal error: Class MediaSimple contains 1 abstract method and must therefore be declared abstract or implement the remaining methods ...
  #1 (permalink)  
Antiguo 16/09/2010, 10:47
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Pregunta metodo abstracto sin implementar ???

Buenas!!!

PHP me dice que....

Cita:
Fatal error: Class MediaSimple contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (Media::caculate)
pero... yo si lo he implementado!!!! o no ?

Código PHP:
<?

function sumatoria($array){
  
$res=0;
  for (
$i=0;$i<count($array);$i++){
    
$res $res $array[$i];
  }
  return 
$res;
}

abstract Class 
Media {
  private 
$n;
  private 
$array = array();

  protected function 
media($n){
    
$this->setN($n);
  }
  
  
// agrega a $rb los elemenos de $ra
  
protected function add_array(array $ra,array $rb){
    foreach (
$rb as $val){
      
$ra[] = $val;
    }
  }
  
   protected function 
add($data) {
    if (!
is_set($array)){
      if (
is_array($data)){
        
$this->add_array ($this->array,$data);
      }else{
        
$this->array[] = $data;       
      }    
    }
  }
  
  protected function 
setN(){
    
$this->$n;
  }
  
  abstract protected function 
caculate();
  
// fin


Class MediaSimple extends Media {
  
  public function 
calculate(){
    return (
sumatoria ($this->array) / $this->n);  
  }
  
}

?>
__________________
Salu2!
  #2 (permalink)  
Antiguo 16/09/2010, 11:01
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: metodo abstracto sin implementar ???

Tu declaras la función como protected en tu clase padre, y en la clase hija como publica, las dos tienen que tener la misma visiblidad para que funcione correctamente.

Saludos.
  #3 (permalink)  
Antiguo 16/09/2010, 16:34
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: metodo abstracto sin implementar ???

Hola GatorV

He intentado lo que me decis...le he quitado el PROTECTED al metodo ABSTRACTO en clases padre e hija y no me funciono!

Sigo con problemas... no logro poder hacer abstracta mi clase !

Código PHP:
<?php
/* 
  metodos: add, reset, setN, setNesimo, caculate, unDo (deshace el ultimo calculo)
*/
abstract Class Media {
  protected 
$n;
  protected 
$arr = array();
  protected 
$arrSize;
  protected 
$calculo   =null;
  protected 
$calculoAux=null// guarda valor anterior

  
protected 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;
  }
  
  
# private o 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
  
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;
  }
  
  abstract protected function 
caculate(); // debe ser abstracta igual que la clase!!!
  
// fin


Class MediaSimple extends Media {

  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;
  }
    
  protected 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);
  }
      
  function 
setEma ($ema){
    
$this->calculo $ema;
  }  
    
    
  protected function 
calculate(){
    
$this->saveCalc();
    
    
$k = (/ ( $this->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);  
  }
  
}

?>
__________________
Salu2!
  #4 (permalink)  
Antiguo 16/09/2010, 16:48
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: metodo abstracto sin implementar ???

Segun el manual...estaria bien lo que hago... aunque obviamente... no lo esta!

http://php.net/manual/en/language.oop5.abstract.php

Cita:
all methods marked abstract in the parent's class declaration must be defined by the child; additionally, these methods must be defined with the same (or a less restricted) visibility. For example, if the abstract method is defined as protected, the function implementation must be defined as either protected or public, but not private.
Por que no me funciona ?? :(
__________________
Salu2!
  #5 (permalink)  
Antiguo 16/09/2010, 19:49
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: metodo abstracto sin implementar ???

Pues si te fijas tu método abstracto se llama caculate, cuando el método que estas sobreescribiendo es calculate.

Saludos.
  #6 (permalink)  
Antiguo 17/09/2010, 08:21
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
De acuerdo Respuesta: metodo abstracto sin implementar ???

Cita:
Iniciado por GatorV Ver Mensaje
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;
  }
  
  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 = (/ ( $this->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);  
  }
  
}

?>
__________________
Salu2!

Última edición por Italico76; 17/09/2010 a las 08:36

Etiquetas: implementar, metodo
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:24.