Announcement

Collapse
No announcement yet.

OOP - Vererbung

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • OOP - Vererbung

    Hallo,

    es git bereits eine Produktklasse. Jetzt kommen aber neue Prodikte mit zum Teil anderen Spezifikationen dazu.

    Dazu wollte ich eine weitere Klasse anlegen.

    In der Produktklasse werden in einer Methode alle Daten ausgelesen und diese Methode will ich nun überschreiben.

    Ich weiß jedoch nicht, wie ich die beiden Klassen einbinde, da man ja vorher wissen muss um was für ein Produktkategorie es sich handelt. Muss diese Methode zur Kategoriermittlung in die Oberklasse mit rein?

    Ich hatte mir folgendes überlegt, aber das sieht mir nicht nach ner guten Lösung aus:

    PHP Code:
    $p = new product($name); //Bücher
    $c $p->getCategory();
    if (
    $c == 'dvd') {
      
    $p = new product_extends($name); //DVD
    }

    $data $p->getData(); 

  • #2
    Hallo baserider,

    hierzu könntest du deine "Basisklasse" mit einer statischen Funktion getInstance() versehen. Diese kann dann anhand der Kategorie entscheiden und eine passende Instanz zurückgeben:

    PHP Code:
    ...
    class 
    product {
      function 
    __construct($pName
      {
      ...
      }
      
      static function 
    getCatFromName($pName
      {
      ...
      }

      static function 
    getInstance($pName) {
        switch (
    self::getCatFromName($pName)) {
          case 
    'dvd'
            return new 
    product_extends($pName);
            break;
          default: 
            return new 
    product($pName);
        }
      }
    }

    ...
    $p product::getInstance($pName);
    ... 
    Gruß Falk
    Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

    Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

    Comment


    • #3
      Hallo Falk,

      ich habe es mit dem Factory-Pattern gut hinbekommen, das ist auch ähnlich deinem Beispiel. (Eine Oberklasse und die erbenden Klassen). Objekte werden jeweils aus dem übergebenen Parameter erzeugt.

      Aber eine Frage gibt es noch... angenommen ich habe in den erbenden Klassen verschiedene Methoden

      PHP Code:
      class dvd extends product{
          public function 
      playtime(){}
      }

      class 
      buch extends product{
          public function 
      pagenum(){}
      }

      class 
      factory{
          public static function 
      get($class){
              return new 
      $class();
          }

      woher weiß ich nun, ob ich auf $p->playtime bzw. $p->pagenum zugreifen kann oder nicht? das hängt ja vom parameter ab

      Müsste man dann jedesmal prüfen
      PHP Code:
      if ($param == 'buch'){$p->pagenum()} 
      erscheint mir aber nicht sehr flexibel...

      Evtl. ist ja dieses Pattern auch gar nicht für sowas ausgelegt...
      Zuletzt editiert von baserider; 30.03.2009, 22:33.

      Comment


      • #4
        Hallo baserider,

        allgemeingültig kannst du natürlich nur auf die Methoden zugreifen, die von der Basisklasse geerbt wurden. Die speziellen Funktionen einer Klasse kannst du nur in einem Context benutzen, in dem die genutzte Klasse eindeutig bekannt ist.

        Für eine passende Prüfung sollte aber besser die Funktion is_a() benutzt oder auf die Existenz der gewünschten Methode geprüft werden.

        PHP Code:
        ...
          if (
        is_a($p'buch') {
            
        // Gültiger Buch-Context
            
        $p->pagenum();
            ...
          }
        ...
          if (
        method_exists($p'pagenum') {
            
        $p->pagenum();
          }
        ... 
        Gruß Falk
        Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

        Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

        Comment

        Working...
        X