Général Polymorphisme avec PHP exemples

Que seuls les Chiens peuvent jouer "fetch", est-ce un exemple d'une bonne ou une mauvaise idée? Je soupçonne que c'est une très mauvaise idée à cause de l'utilisation de instanceof, mais je ne suis pas entièrement sûr de savoir pourquoi.

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

Un autre exemple. Comme je suis constamment à la création d'objets de données qui ont un ID, j'ai pensé que je pourrais aussi bien s'étendre à partir d'une classe de base pour éviter la duplication de code. Encore une fois, c'était mauvais? En tant que Président de ne pas avoir un nom et un Chien n'a pas de roues. Mais ils sont à la fois des Objets de Données de sorte qu'il est très déroutant.

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;
    }
}

Essentiellement ce que je pense je pose la question est: "doit toutes les classes ont la même interface ou peuvent-ils avoir différents?"

  • Assez sûr que cela a été demandé ici avant, mais la réponse courte est que c'est OK pour les sous-classes pour avoir une interface différente.
  • Je suis sûr que le premier exemple n'est pas droit en raison de l'utilisation de instanceof pour la logique conditionnelle. N'est pas du tout le point de Polymorphisme de ne pas le faire?
  • Pourquoi voudriez-vous d'obtenir tous les animaux de faire quelque chose (parler), à l'exception d'un type (Chien)? Sonne comme défectueux, la logique est dans la boucle, pas les définitions de classe.
  • Ils parlent tous, y compris le chien. Mais seulement le chien peut jouer à rapporter. De toute façon, je pense que je pourrais avoir trouvé quelque chose d'utile ici: stackoverflow.com/questions/6119087/...
  • Si deux objets différents pour faire la même chose de différentes façons, c'est le polymorphisme. Si un objet peut en outre faire autre chose, eh bien, ainsi soit-il. Ce n'est pas un comportement polymorphique alors, puisque c'est un comportement unique pour l'objet. Vous ne serait pas juste de traiter ce comportement spécifique, comme polymorphe ensuite.
  • qui a le sens parfait, merci. Cela s'applique parfaitement à mon deuxième exemple. Je pense que mon premier est toujours très erronée comme je viens de lire cette citation de Scott Meyers: "Quand vous vous trouvez à l'écriture de code de la forme "si l'objet est de type T1, puis faire quelque chose, mais si elle est de type T2, puis faire quelque chose d'autre," la claque de vous-même."
  • Data_Object sonne comme un mauvais nom de classe. Probablement ModelAbstract est plus appropriée.
  • Je pense que si vous avez un chèque de instanceof pour jouer à rapporter, il devrait être remplacé par $animal->canPlayFetch()
  • FTR, le titre est trompeur. deceze réponse dans les commentaires répondu à la question générale sur le polymorphisme, où la question et a accepté de répondre ont été orientés vers un exemple précis.
  • Ce site web ont une très bonne explication et des exemples de pratiques phpenthusiast.com/object-oriented-php-tutorials/... // phpenthusiast.com/object-oriented-php-tutorials/...

InformationsquelleAutor Dan | 2011-12-17