Ver Mensaje Individual
  #1 (permalink)  
Antiguo 04/02/2010, 11:40
xberni
 
Fecha de Ingreso: enero-2005
Ubicación: Barcelona (España)
Mensajes: 134
Antigüedad: 19 años, 3 meses
Puntos: 0
Colección de objetos de diferentes clases

Hola a todos. Una consulta:

Quisiera saber como manejo una colección de objetos de clases diferentes, heredados de una super clase abstracta, si es que es posible. Cuando la clase no es abstracta, no tengo problemas. Por ejemplo, con las típicas clases de Producto y ConjuntoProductos, lo hago así:
Código PHP:
class Producto {
  ...
  public static function 
load($id$conn) {
    ...
    return 
$producto;
  }
}

class 
ConjuntoProductos {
  ...
  public function 
getTodosLosProductos($conn) {
    
$productos = array();
    
$sql "SELECT * FROM producto ORDER BY id";

    if (
$res $conn->query($sql)) {
      while (
$row $res->fetch_assoc())
      {
         
$productos[] = Producto::load($row['id'], $conn);    
      } 
      return 
$productos;
    } else {
      throw new 
SQLException("Error en la base de datos");
    }
  }
  ...

Pero ahora quiero hacer una variación. Tengo una clase abstracta Producto, de la cual heredan otras, como ProductoDeTipoA y ProductoDeTipoB. Me gustaría tener una colección de productos, de todos, en la que habrá mezclados productos de un tipo y de otro. Tengo:

Código PHP:
abstract class Producto {
  ...
}
class 
ProductoDeTipoA extends Producto {
  ...
  public static function 
load($id$conn) {
    ...
    return 
$producto;
  }
}
class 
ProductoDeTipoB extends Producto {
  ...
  public static function 
load($id$conn) {
    ...
    return 
$producto;
  }

Me gustaría saber como tendría que implementar el método ConjuntoProductos->getTodosLosProductos(), teniendo en cuenta que puede haber productos de los dos tipos, y a priori no sé de que tipo son

Código PHP:
class ConjuntoProductos {
  ...
  public function 
getTodosLosProductos($conn) {
    
$productos = array();
    
$sql "SELECT * FROM producto ORDER BY id";

    if (
$res $conn->query($sql)) {
      while (
$row $res->fetch_assoc())
      {
         
//Aquí, al hacer el load no se a que clase tengo que llamar (TipoA?, TipoB?)
         
$productos[] = Producto::load($row['id'], $conn);    
      } 
      return 
$productos;
    } else {
      throw new 
SQLException("Error en la base de datos");
    }
  }
  ...

Gracias, y disculpad por el peñazo...