4 votes

Surcharger les méthodes des grands-parents en php

Je suis en train d'écrire un ensemble de classes squelettes pour une application, en commençant par une classe de base appelée StoreLogic qui contient les règles fiscales, les règles d'escompte, etc. Les classes Panier, Commande, Devis, etc. étendront StoreLogic car elles utiliseront toutes les mêmes méthodes que StoreLogic.

Une fois ces classes de base terminées, je les implémenterai en étendant les classes Cart, Order, Quote et StoreLogic car chaque application de ces classes sera différente en fonction des besoins de nos différents clients. Remplacer les méthodes des classes mères est facile, mais remplacer les classes grand-parentes avant que leurs enfants ne les aient étendues semble... impossible ? J'ai l'impression que je ne m'y prends pas de la bonne façon(tm)... et je pense que quelqu'un de plus expérimenté comme vous pourrait m'indiquer la bonne direction. Jetez un coup d'œil au code et voyez ce que vous en pensez !

/* My core classes are something like this: */
abstract class StoreLogic
{
    public function applyDiscount($total)
    {
        return $total - 10;
    }
}

abstract class Cart extends StoreLogic
{
    public function addItem($item_name)
    {
        echo 'added' . $item_name;
    }
}

abstract class Order extends StoreLogic
{
    // ....
}

/* Later on when I want to use those core classes I need to be able to override
 * methods from the grandparent class so the grandchild can use the new overriden
 * methods:
 */
class MyStoreLogic extends StoreLogic
{
    public function applyDiscount($total) {
        return $total - 5;
    }
}

class MyOrder extends Order
{
    // ...
}

class MyCart extends Cart
{
    public $total = 20;

    public function doDiscounts()
    {
        $this->total = $this->applyDiscount($this->total);
        echo $this->total;
    }
}

$cart = new MyCart();
$cart->doDiscounts(); // Uses StoreLogic, not MyStoreLogic..

3voto

Baba Points 49157

Je pense qu'il vous manque une logique très élémentaire

- MyCart extends Cart
- Cart extends StoreLogic

Si vous souhaitez utiliser MyStoreLogic puis cart doit être défini comme suit

 abstract class Cart extends MyStoreLogic

Si vous ne voulez pas faire cela, vous pouvez avoir

$cart = new MyCart();
$cart->doDiscounts(new MyStoreLogic()); // output 15

Modification de classe

class MyCart extends Cart {
    public $total = 20;
    public function doDiscounts($logic = null) {
        $this->total = $logic ? $logic->applyDiscount($this->total) : $this->applyDiscount($this->total);
        echo $this->total;
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X