Como solo los perros pueden jugar "fetch", ¿es este un buen o una mala idea? Sospecho que es una muy mala idea debido al uso de instanceof, pero no estoy del todo seguro de por qué.Polimorfismo general con ejemplos de PHP
class Animal {
var $name;
function __construct($name) {
$this->name = $name;
}
}
class Dog extends Animal {
function speak() {
return "Woof, woof!";
}
function playFetch() {
return 'getting the stick';
}
}
class Cat extends Animal {
function speak() {
return "Meow...";
}
}
$animals = array(new Dog('Skip'), new Cat('Snowball'));
foreach($animals as $animal) {
print $animal->name . " says: " . $animal->speak() . '<br>';
if ($animal instanceof Dog) echo $animal->playFetch();
}
Otro ejemplo. Como estoy constantemente creando objetos de datos que tienen una ID, pensé que también podría extenderlos a todos desde una clase base para evitar la duplicación de código. De nuevo, esto estuvo mal ¿no? Como una silla no tiene nombre y un perro no tiene ruedas. Pero ellos son ambos objetos de datos por lo que es muy confuso.
class Data_Object {
protected $_id;
function setId($id) {
$this->_id = $id;
}
function getId() {
return $this->_id;
}
}
class Dog extends Data_Object {
protected $_name;
function setName($name) {
$this->_name =
}
function getName() {
return $this->_name;
}
}
class Chair extends Data_Object {
protected $_numberOfWheels;
function setNumberOfWheels($number) {
$this->_numberOfWheels = $number;
}
function getNumberOfWheels() {
return $this->_numberOfWheels;
}
}
Esencialmente lo que yo creo que estoy pidiendo es: "todas las subclases deben tener la misma interfaz o pueden tener otros diferentes?"
bastante seguro de que se ha pedido aquí antes, pero la respuesta corta es que está bien que a subclases tienen una interfaz diferente. – NullUserException
Estoy bastante seguro de que el primer ejemplo no es correcto debido al uso de instanceof para la lógica condicional. ¿No es el objetivo del Polimorfismo no hacer esto? – Dan
¿Por qué querrías hacer que todos los animales hicieran algo (hablar), excepto un tipo (perro)? Parece que la lógica defectuosa está en el bucle, no las definiciones de clase. – NullUserException