Casio Relojes CasioComprar Reloj RelojesVenta OnlineValencia F1JTcKl3

Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos » Reloj – Correa Acero Kors Con Michael De Inoxidable Cuarzo Mk3179 ID2E9YWHEstas en el tema de Usar método de una superclase en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola a todos, Tengo una duda de como usar un método de la superclase de un objeto, en lugar de la suya propia. Es decir, ...
  #1 (permalink)  
26/03/2008, 06:47
 
Fecha de Ingreso: enero-2005
Ubicación: Barcelona (España)
Mensajes: 134
Antigüedad: 14 años, 2 meses
Puntos: 0
Usar método de una superclase

Hola a todos,

Tengo una duda de como usar un método de la superclase de un objeto, en lugar de la suya propia. Es decir, de manera similar a hacer esto:

Código PHP:
parent::metodo
(); 
pero referido a un objeto digamos, externo

Imaginad que tengo la clase A con este método: metodo1();

La clase B hereda de A y redefine el metodo: metodo1();

En un momento de la ejecucion tengo un objeto B, y me gustaría ejecutar el metodo1() pero de su superclase A.

He probado varias cosas, pero ninguina funciona:

Código PHP:
$a->parent::metodo1();
$a::parent->metodo1(); 

etc etc

Disculpad si la pregunta está mal hecha, pero estoy empezando con POO
  #2 (permalink)  
26/03/2008, 08:57
GatorV Reloj – Correa Acero Kors Con Michael De Inoxidable Cuarzo Mk3179 ID2E9YWH
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567 Reloj – Correa Acero Kors Con Michael De Inoxidable Cuarzo Mk3179 ID2E9YWH
Antigüedad: 12 años, 10 meses
Puntos: 2127
Re: Usar método de una superclase

Lo que tendrías que hacer es desde dentro de la clase llamar al método de la clase que lo hereda, o instanciar directamente un objeto A y llamar al método:
Código PHP:
class {
      public function 
metodo() {
                echo 
"metodo() en A!"Ofertas Ordenado A Mayor Y Relojes Precio Página Menor Por kXuZTOPi;
      }
}

class 
extends {
      public function 
metodo() {
                echo 
"metodo() en B!";
                
parent::metodo();
      }
}

$a = new A();
$b = new B();
$b->metodo(); // llamamos por la clase B
$a->metodo(); // llamamos directamente desde A 
Saludos.
Casio 1av Edifice Cronografo Efx Reloj Gold Label 500bk R3Aj4c5Lq
  #3 (permalink)  
26/03/2008, 12:06
Hard De 1 Lauren To Parfumperfume Glamourous Full Find 7oz50mlspray Details Eau About Ybv6y7fg
 
Fecha de Ingreso: septiembre-2006
Ubicación: Montevideo-Uruguay
Mensajes: 42
Antigüedad: 12 años, 6 meses
Puntos: 2
Re: Usar método de una superclase

A::metodo1 (supongo)

Última edición por pilsenero; 26/03/2008 a las 12:25

Reloj – Correa Acero Kors Con Michael De Inoxidable Cuarzo Mk3179 ID2E9YWH

  #4 (permalink)  
27/03/2008, 10:56
 
Fecha de Ingreso: enero-2005
Ubicación: Barcelona (España)
Mensajes: 134
Antigüedad: 14 años, 2 meses
Puntos: 0
Re: Usar método de una superclase

A ver, con la pregunta que he hecho no resuelvo mis dudas. Para preguntar también hay que saber...

Os cuento mi problema a ver si alguien me puedo ayudar:

Estoy haciendo una práctica, de una administración de una pizzeria en la que guardamos información de las pizzas y de sus ingredientes, de esta manera:

Pizza 4 Estaciones:
1- Tomate: 50 gr
2- Cebolla: 20 gr
3- Salchichas: 20 gr

Pizza Margarita:
1- Tomate: 50 gr
2- Mozzarella: 35 gr
etc

Pulsera Relojes En Mujer Mercado Reloj Libre Swatch Sumergible Ygfyb76 El número que hay en los ingredientes es el orden de los mismos, que es importante, y debe ser ese y no otro. en la administración podemos modificar ese orden.

Tengo 3 clases / tablas: Pizza, Ingrediente y Composicion (que es la tabla de relacion Pizza / Ingrediente y que tiene el atributo Orden)

En el formulario donde añado un ingrediente a una pizza no puedo decir cual es el orden del ingrediente. El método composicion->save() busca el siguiente numero de orden libre y lo añade automaticamente. Si añadieramos un ingrediente a la primera pizza, le asignaría el orden 4. Hasta aquí todo ok.

¿Qué pasa si elimino un ingrediente de una pizza? Si tengo 1, 2 ,3 y 4 ingredientes y elimino digamos el 2, la lista de ingredientes debería reordenarse (1, 2 y 3). Vale, tengo un método pizza->reordenarIngredientes() que hace esta función. El problema viene cuando guardo la pizza con sus ingredientes. Llega un momento que se invoca al método composicion->save() y como he explicado en el párrafo anterior, lo que hace es buscar el primer orden libre, no empieza desde el 1. Por ejemplo, si tengo la pizza:

Pizza 4 Estaciones:
1- Tomate: 50 gr
2- Cebolla: 20 gr
3- Salchichas: 20 gr

Y borro el ingrediente de orden 2 obtengo esto:

Pizza 4 Estaciones:
4- Tomate: 50 gr
5- Salchichas: 20 gr

A ver si alguien me puede echar un cable. Perdonad por el rollo que os he pegao
  #5 (permalink)  
Sur Orologio Marino Watches Niko San Polso Détails Esclusivo Da Originale 7Ybfy6g
27/03/2008, 11:51
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 12 años, 10 meses
Puntos: 2127
Reloj – Correa Acero Kors Con Michael De Inoxidable Cuarzo Mk3179 ID2E9YWH
Re: Usar método de una superclase

En ese caso, mejor pon el algoritmo de la función reordenarIngredientes, ya que ahí puede ser que este el problema, ya que en lugar de llamar a save() deberías de llamar a update() para actualizar el valor del orden (no borrarlo y re-insertarlo)

Saludos.
  #6 (permalink)  
28/03/2008, 03:26
  Reloj – Correa Acero Kors Con Michael De Inoxidable Cuarzo Mk3179 ID2E9YWH
Fecha de Ingreso: enero-2005
Ubicación: Barcelona (España)
Mensajes: 134
Antigüedad: 14 años, 2 meses
Puntos: 0
Re: Usar método de una superclase

Gracias por la ayuda GatorV,

Antes que nada te comento que estoy usando Symfony, no se si conoces un poco el funcionamiento, pero se crean unas clases base (PizzaBase, IngredientBase y CompositionBase) que contienen todos los setters, getters, metodos save, delete, etc etc), y luego en tus clases (Pizza, Ingredient y composition) que heredan de las clases base, añades o redefines los métodos que quieras / necesites. Además, los métodos save() ya son lo suficientemente inteligentes para hacer un insert o un update segun sea la necesidad, así como de grabar los elementos asociados (por ejemplo grabar los ingredientes si grabas la pizza)

El método composition save(), que redefine al método de su superclase es este:

For Jonze's Selectworldly Insane Perfume Spike Ad Kenzo 5AR34jL
Código PHP:
public function save($con null)
    {
        
$con Propel::getConnection();
          try
          {
            
$con->begin();
            
            
$orden $this->getSiguienteOrden();
            
            
$this->setOrden($orden);
             
$ret Herrera Para Mujeres Sexy Carolina 212 4ARq3jL5parent::save($con);
             
            
$con->commit();
 
            return 
$ret;
        }
          catch (
Exception $e)
          {
            
$con->rollback();
            throw 
$e;
          }
    } 
Básicamente asigna un orden al ingrediente y llama al save() de su superclase. Este método usa Creole como abstracción de la base de datos:
Código PHP:
Reloj – Correa Acero Kors Con Michael De Inoxidable Cuarzo Mk3179 ID2E9YWH protected function getSiguienteOrden()
    {
        
$idPizza $this->getPizzaId();
        
        
$conexion Propel::getConnection();
        
$consulta Celulares Celulares RelojTeléfonos En En BucaramangaOlx RelojTeléfonos XZOiTwPulk'SELECT MAX(%s) AS max FROM %s WHERE %s = %s';
        
$consulta sprintf($consultaCompositionPeer::ORDENCompositionPeer::TABLE_NAMECompositionPeer::PIZZA_ID$idPizza);
        
$sentencia $conexion->prepareStatement($consulta);
        
        
$resultset $sentencia->executeQuery();
        
$resultset->next();
        
$max $resultset->México Reloj 3489 En Mercado Libre Mk uXkPiZgetInt('max');
        
        return 
$max+1;    

    } 
El método pizza->reordenaIngredientes() es así de simple:

Código PHP:
protected function reordenaIngredientes()
    {
        
$compositions $this->
Reloj – Correa Acero Kors Con Michael De Inoxidable Cuarzo Mk3179 ID2E9YWH
getCompositions();
        
        foreach (
$compositions as $composition)
        {
            
$orden 1;
            
$composition->setOrden($orden);
            
$orden++;
        }
    } 
Cuando elimino un ingrediente es cuando tengo que reordenar los ingredientes y grabar todo. Redefino el delete() de la superclase de composition:

Código PHP:
public function delete(Reloj – Correa Acero Kors Con Michael De Inoxidable Cuarzo Mk3179 ID2E9YWH$con null)
    {
    
$con Propel::getConnection();
          try
          {
            
$con->begin();
            
             
$ret parent::delete($con);
             
$this->getPizza($con)->reordenaIngredientes();
Inteligente E Watch Access Michael Mkt5005 Reloj Kors WHY2beED9I             
             
$this->getPizza($con)->save();

            
$con->commit();
 
            return 
$ret;
        }
          catch (
Exception $e)
          {
            
$con->rollbackSignature Eau Womens De Natural About Details Perfume Spray Versace Parfum 100ml wO8nPkN0XZ();
            throw 
$e;
          }
    } 
Pero claro, al hacer pizza->save(), cuando ejecuta composition->save(), pues eso, que vuelve a llamar a getSiguienteOrden()...

Última edición por xberni; 28/03/2008 a las 05:33
  #7 (permalink)  
28/03/2008, 09:57
Relojes Corte Hamilton El Inglés · 2 Y Moda Hombre Joyería O8wPkn0
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 12 años, 10 meses
Puntos: 2127
Re: Usar método de una superclase

Tu problema lo puedes solucionar fácilmente, agrega un método nuevo a tu clase Pizza llamado saveSinReordenar y a tu clase composition, y llama a esos métodos desde tu clase delete.

Saludos.
  #8 (permalink)  
RojoCorrea U0979l3 Color Mujer Para De Reloj Guess CeWrxdBo
 
Fecha de Ingreso: enero-2005
Ubicación: Barcelona (España)
Mensajes: 134
Antigüedad: 14 años, 2 meses
Puntos: 0
Re: Usar método de una superclase

Cita:
Iniciado por GatorV
Tu problema lo puedes solucionar fácilmente, agrega un método nuevo a tu clase Pizza llamado saveSinReordenar y a tu clase composition, y llama a esos métodos desde tu clase delete.

Saludos.
Gracias GatorV,

Precisamente esto que me comentas enlaza con el título del post y el primer mensaje, ya que los metodos save() de las clases Base (PizzaBase y CompositionBase) de las cuales heredan Pizza y Composition, ya hacen esto que comentas, hacen un save() sin reordenar. Mi pregunta es: ¿si tengo un objeto Pizza, puedo usar el método save() de su superclase PizzaBase de alguna manera, en lugar del suyo propio???
Es 200 G Watch Hombre Para 1aer ShockReloj Casio Shop™ Negro Ga mnOyvN80w
  #9 (permalink)  
31/03/2008, 16:16
Reloj – Correa Acero Kors Con Michael De Inoxidable Cuarzo Mk3179 ID2E9YWH
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 12 años, 10 meses
Puntos: 2127
Re: Usar método de una superclase

El problema es que como ya lo sobrescribiste, no puedes pasarte al método padre, por eso es necesario que crees nuevos métodos:
Código PHP:
class Pizza extends PizzaBase {
        
// metodos
        
public function saveSinOrdenReloj – Correa Acero Kors Con Michael De Inoxidable Cuarzo Mk3179 ID2E9YWH() {
                  
parent::save();
        }

Saludos.
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.




La zona horaria es GMT -6. Ahora son las 17:06.