millancore / php-study

Grupo de estudio de PHP en https://frontend.cafe
6 stars 2 forks source link

Pajaros #2

Open millancore opened 3 years ago

millancore commented 3 years ago

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:

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();