Klassendesign

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • #16
    Danke für deine Hilfe. Mit der Factory klappt super :-)

    Aber wenn man nun sehr viele Kategorien hat, dann wird es mit dem überprüfen von instanceof schon etwas aufwendiger :-) aber es klappt alles :-)

    Kommentar


    • #17
      Original geschrieben von lx-club
      Aber wenn man nun sehr viele Kategorien hat, dann wird es mit dem überprüfen von instanceof schon etwas aufwendiger :-)
      Nicht wenn du mit Vererbungen arbeitest.

      Kommentar


      • #18
        ich arbeite ja mit Vererbungen

        class DVD extends Product usw....

        Ich hab es so verstanden:

        PHP-Code:
        if ($obj instanceof DVD){
            
        $obj->getPlaytime();
        }

        if (
        $obj instanceof Buch){
            
        $obj->getPagenum();

        Wenn man nun nicht nur DVD als eine Produktart hat sondern noch 10 ander muss man doch für jede Klasse prüfen oder?

        Kommentar


        • #19
          Die Frage ist, was du machen willst.

          Wo ist denn sowas erforderlich?
          PHP-Code:
          if ($obj instanceof DVD){
              
          $obj->getPlaytime();
          }

          if (
          $obj instanceof Buch){
              
          $obj->getPagenum();

          Das eine ist eine Zeit, das andere eine Nummer. Was willst du jetzt wirklich? Du solltest dich vielleicht auf eine Schnittstelle einigen, damit du bei jeder Klasse andere Funktionsnamen hast.

          Kommentar


          • #20
            PHP-Code:
            interface Identifiable { ... }
            interface 
            Listable { ... }
            abstract class 
            Factory { ... }
            abstract class List implements 
            ArrayIterator { ... }
            class 
            ProductFactory extends Factory { ... }
            class 
            ProductList extends List { ... }
            class 
            Product implements IdentifiableListable { ... }
            class 
            CD extends Product { ... }
            class 
            DVD extends Product { ... } 
            So in etwa.

            Zum Anzeigen der Liste über ihren Iterator laufen und an jedem Element getDetails() oder sowas aufrufen. Das liefert dann eben ein Array, in dem bei CDs eben die Playtime und bei DVDs wasweisich drinsteht.
            Zuletzt geändert von onemorenerd; 01.04.2009, 20:08.

            Kommentar


            • #21
              Original geschrieben von h3ll
              Die Frage ist, was du machen willst.

              Wo ist denn sowas erforderlich?
              PHP-Code:
              if ($obj instanceof DVD){
                  
              $obj->getPlaytime();
              }

              if (
              $obj instanceof Buch){
                  
              $obj->getPagenum();

              Das eine ist eine Zeit, das andere eine Nummer. Was willst du jetzt wirklich? Du solltest dich vielleicht auf eine Schnittstelle einigen, damit du bei jeder Klasse andere Funktionsnamen hast.
              das ist doch grad der sinn der vererbung, das ich spezielle eigenschaften hinzufügen kann. ich will bei ner dvd die spiellänge wissen und bei nem buch die anzahl der seiten...genau das will ich anzeigen.

              Kommentar


              • #22
                Original geschrieben von onemorenerd
                PHP-Code:
                interface Identifiable { ... }
                interface 
                Listable { ... }
                abstract class 
                Factory { ... }
                abstract class List implements 
                ArrayIterator { ... }
                class 
                ProductFactory extends Factory { ... }
                class 
                ProductList extends List { ... }
                class 
                Product implements IdentifiableListable { ... }
                class 
                CD extends Product { ... }
                class 
                DVD extends Product { ... } 
                So in etwa.

                Zum Anzeigen der Liste über ihren Iterator laufen und an jedem Element getDetails() oder sowas aufrufen. Das liefert dann eben ein Array, in dem bei CDs eben die Playtime und bei DVDs wasweisich drinsteht.
                ich glaub hab noch einiges zu lernen was oop betrifft :-), aber so ähnlich wie du beschreiben hast hab ich es gemacht... in ner methode showSpecifications() wird nen array zurückgegeben mit den jeweiligen daten

                Kommentar


                • #23
                  Original geschrieben von lx-club
                  das ist doch grad der sinn der vererbung, das ich spezielle eigenschaften hinzufügen kann. ich will bei ner dvd die spiellänge wissen und bei nem buch die anzahl der seiten...genau das will ich anzeigen.
                  Was willst du anzeigen? Antworte jetzt nicht mit "spiellänge" und "anzahl der seiten", sondern finde einen Oberbegriff dafür, denn genau das willst du anzeigen. Jetzt brauchst du nur noch Funktionen nach diesem Oberbegriff benennen und schon hast du überall eine Funktion, die gleich heißt, aber was unterschiedliches liefert.

                  Kommentar


                  • #24
                    Original geschrieben von h3ll
                    Jetzt brauchst du nur noch Funktionen nach diesem Oberbegriff benennen und schon hast du überall eine Funktion, die gleich heißt, aber was unterschiedliches liefert.
                    ich möchte alle daten zum produkt ausgeben.... da zählt jan icht nur spiellänge oder seitenzahl dazu sondern auch andere daten.

                    du meinst sowas hier?

                    PHP-Code:
                    public function getData(){
                        return 
                    $this->playtime// in der DVD-Klasse


                    bzw.
                    public function 
                    getData(){
                        return 
                    $this->pagenum// in der Buch-Klasse

                    Da ich aber mehrere Eigenschaften ausgeben will gebe ich ein Array zurück, wie es hier auch vorgeschlagen wurde.

                    Kommentar


                    • #25
                      Man kann onemorenerd's Klassen auch noch weiter stricken, dann löst sich auch dein Problem. Ich nehme mal an, du willst die Produkte ausgeben.

                      PHP-Code:
                      abstract class ProductWebControl extends WebControl {
                          public function 
                      __construct(Product $p) { ... }
                          abstract public function 
                      render();
                      }
                      class 
                      ProductWebControlFactory extends Factory {
                          public function 
                      fabricate(Product $p) { ... }
                      }
                      class 
                      CDWebControl extends ProductWebControl {
                          public function 
                      render() {
                              echo 
                      $this->product->getPlaytime();
                          }
                      }
                      class 
                      BuchWebControl extends ProductWebControl {
                          public function 
                      render() {
                              echo 
                      $this->product->getPageCount();
                          }

                      Kommentar

                      Lädt...
                      X