Este reto consiste en crear una clase pájaro concreta ( Gallina, Pato, etc) que implemente la siguiente Interfaz,
interface BirdInterface
{
public function lay();
}
Cada pájaro tendrá un método para poner un huevo y una vez ese huevo eclosione el nuevo pájaro deberá ser del tipo de su padre.
La clase Huevo solo deberá crearse una vez y debe ser valida para todo tipo de pájaros.
Ejemplo de las reglas:
Una gallina pone un huevo que eclosionará en una nueva gallina.
Los huevos de otros tipos de pájaros deberían eclosionar en un nuevo pájaro de su tipo madre.
Un huevo que ha eclosionado no puede volver a hacerlo.
Solucion
Primero que todo crearemos una clase abstracta la cual implementara la interfaz y el método lay (poner un huevo) usaremos static:class para traer el nombre+namespace de la clase concreta de pájaro (Duck) que extiende de esta clase.
abstract class AbstractBird implements BirdInterface
{
public function lay(): Egg
{
return new Egg(static::class);
}
}
Nuestra clase Egg es muy sencilla, recibe un string, clase+namespace de la clase pajaro en concreto y la almacena en type. Tambien tiene una variable para validar si el huevo eclosiono o no e impedir que lo haga de nuevo.
class Egg
{
private $type;
private $hatch = false;
public function __construct(string $birdType)
{
$this->type = $birdType;
}
public function hatch()
{
if ($this->hatch) {
throw new \Exception('This Egg has been hatched');
}
$this->hatch = true;
return new $this->type;
}
}
Y por ultimo nuestra clase Pato, sin nada (vacia), a no ser que quieras agregarle cosas de patos.
class Duck extends AbstractBird
{
}
Ejemplo de uso:
$newDuck = new Duck();
$eggDuck = $newDuck->lay();
$babyDuck = $eggDuck->hatch();
Este reto consiste en crear una clase pájaro concreta ( Gallina, Pato, etc) que implemente la siguiente Interfaz,
Cada pájaro tendrá un método para poner un huevo y una vez ese huevo eclosione el nuevo pájaro deberá ser del tipo de su padre.
La clase Huevo solo deberá crearse una vez y debe ser valida para todo tipo de pájaros.
Ejemplo de las reglas:
Solucion
Primero que todo crearemos una clase abstracta la cual implementara la interfaz y el método lay (poner un huevo) usaremos
static:class
para traer el nombre+namespace de la clase concreta de pájaro (Duck) que extiende de esta clase.Nuestra clase Egg es muy sencilla, recibe un string, clase+namespace de la clase pajaro en concreto y la almacena en type. Tambien tiene una variable para validar si el huevo eclosiono o no e impedir que lo haga de nuevo.
Y por ultimo nuestra clase Pato, sin nada (vacia), a no ser que quieras agregarle cosas de patos.
Ejemplo de uso: