Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1

    classi: eredità multipla

    vorrei realizzare in qualche modo un'estensione di classe multipla (vietata in php). insomma, una situazione di questo tipo:

    Codice PHP:
    class tipo1
    {
      public 
    $prop1;
      public 
    $prop2;
      ...
    }

    class 
    tipo2
    {
      public 
    $prop1;
      public 
    $prop2;
      ...
    }

    class 
    operativa1 extends tipo1 { ... }
    class 
    operativa2 extends tipo2 { ... }
    class 
    operativa3 extends tipo1tipo2 
    come vedete:
    - le due classi tipo in realtà sono solo dei vettori di dati privi di metodi
    - le classi operative estendono i vettori di dati che gli servono
    - ...operativa3 estende DOVREBBE estendere entrambi i tipi...

    come posso risolvere?
    si vivono molte vite e si muore una volta sola

  2. #2
    AGGIUNGO QUESTO:

    un commento sulla documentazione di php mi ha fatto riflettere. diceva piu' o meno "un linguaggio ha molti strumenti per farti raggiungere l'obiettivo. se non riesci a raggiungere un obiettivo con uno strumento, prova a cambiare strumento. se tenti di usare diversamente lo strumento, sei sulla strada sbagliata"

    insomma: si vede che non devo usare due classi tipo. ma che posso fare allora?
    per ora ho adottato questa soluzione:
    1) ho creato le classi tipo
    2) le istanze delle classi operative hanno delle proprietà che sono istanze delle classi tipo.

    percui operativa 3 avrà due proprietà-istanza delle classi tipo1 e tipo2. ma ci sono delle complicazioni che vi lascio immaginare
    si vivono molte vite e si muore una volta sola

  3. #3
    Ok, ho lo stesso identico quesito!!

  4. #4
    purtroppo l'ereditarietà muiltipla non è prevista in PHP5, speriamo in PHP6..

  5. #5
    l'eriditarietà multipla è una caratteristicha che sempre meno linguaggi supportano poichè introduce molti problemi e confusione...

  6. #6
    Originariamente inviato da goetas
    l'eriditarietà multipla è una caratteristicha che sempre meno linguaggi supportano poichè introduce molti problemi e confusione...
    nel contempo è fondamentale se uno vuole evitare di scrivere 10 classi che servono solo come base da estendere per scriverci poi sopra il proprio codice

    la confusione, prima di venire dall'ereditarietà multipla, viene da tanti altri fattori ed in primis la poca conoscenza della programmazione ad oggetti, la cattiva organizzazione del codice, concetti errati sul linguaggio e cosi via

    se, ad esempio, in C# non ci fosse l'ereditarietà multipla implementare certe cose non sarebbe possibile!

    ad esempio mettiamo che tu hai un framework base dove tutti gli oggetti devono estendere una specifica classe ... come fai ad aggiungere un interfaccia se già devi estendere quella data classe? devi fare estendere all'interfaccia la classe e poi estendi l'interfaccia ... ma per definizione l'interfaccia è solo la definizione di un set di funzionalità che vanno implementate quindi dovresti utilizzare una classe astratta come base da estendere che estenda l'oggetto base

    insomma un rigiro pazzesco :\
    The fastest Redis alternative ... cachegrand! https://github.com/danielealbano/cachegrand

  7. #7
    Utente di HTML.it L'avatar di Razorblade
    Registrato dal
    Feb 2002
    Messaggi
    1,308
    Originariamente inviato da daniele_dll
    ad esempio mettiamo che tu hai un framework base dove tutti gli oggetti devono estendere una specifica classe ... come fai ad aggiungere un interfaccia se già devi estendere quella data classe? devi fare estendere all'interfaccia la classe e poi estendi l'interfaccia ... ma per definizione l'interfaccia è solo la definizione di un set di funzionalità che vanno implementate quindi dovresti utilizzare una classe astratta come base da estendere che estenda l'oggetto base

    insomma un rigiro pazzesco :\
    Ciao daniele_dll,
    forse non ho capito il tuo esempio, ma in php5 è fattibile.
    Infatti è possibile estendere una classe ed implementare una interfaccia nello stesso tempo, es.

    Codice PHP:
    class rain extends weather implements water 
    Inoltre è possibile estendere una sola classe, ma implementare più interfacce, vedi su http://it.php.net/manual/it/language.oop5.interfaces.php

  8. #8
    mmm mi sa che non ho preso l'esempio più azzeccato

    ne faccio un altro

    mettiamo che tu devi estendere un oggetto base del tuo framework php, o un suo derivato, ed hai la necessità di implementare un'altra classe ... ti tocca fare, ora come ora, una classe intermedia
    The fastest Redis alternative ... cachegrand! https://github.com/danielealbano/cachegrand

  9. #9
    Utente di HTML.it
    Registrato dal
    Sep 2007
    Messaggi
    398
    Originariamente inviato da dogeht
    AGGIUNGO QUESTO:

    un commento sulla documentazione di php mi ha fatto riflettere. diceva piu' o meno "un linguaggio ha molti strumenti per farti raggiungere l'obiettivo. se non riesci a raggiungere un obiettivo con uno strumento, prova a cambiare strumento. se tenti di usare diversamente lo strumento, sei sulla strada sbagliata"

    insomma: si vede che non devo usare due classi tipo. ma che posso fare allora?
    per ora ho adottato questa soluzione:
    1) ho creato le classi tipo
    2) le istanze delle classi operative hanno delle proprietà che sono istanze delle classi tipo.

    percui operativa 3 avrà due proprietà-istanza delle classi tipo1 e tipo2. ma ci sono delle complicazioni che vi lascio immaginare
    Sperando di aver capito bene ho provato a implementare un approccio diverso al tuo problema.
    Volevo fare un esempio semplice poi mi sono messo a leggere le funzioni di reflection e ho voluto provarle.
    Il tuo esempio aveva un problema di fondo anche se ci fosse stata l'eritarieta' multipla hai chiamato due proprieta' con lo stesso nome nelle due classi tipo e come avresti gestito questa cosa nelle classi figlie di entrambi ?.

    prima definisco in una clase astratta i metodi di gestione dei tipi
    Codice PHP:
    abstract class AbsTipo {
       private 
    $numProp 0;
       private 
    $listProp = array();
       
       public function 
    __construct ($str) {
              
    $reflect = new ReflectionClass($str);

              
    $list $reflect->getProperties();
              
    $this->numProp count ($list);
              foreach (
    $list as $prop) {
                   
    $this->listProp[] = $prop->getName();
              }
       }
       public function 
    issetTipo($str) {
           return isSet(
    $this->$str);
       }
       public function 
    getTipo($str) {
          if (
    $this->isSetTipo($str)) {
              return 
    $this->$str;
          }  else {
              return 
    null;
          }
       }
       public function 
    numTipi() {
              return 
    $this->numProp;
       }
       public function 
    listaTipi() {
          return 
    $this->listProp;
       }

    cosi estendendo questa classe posso implementare i tipi in modo molto semplice.

    Codice PHP:
    class tipo1 extends AbsTipo {
       public function 
    __construct() {
              
    parent::__construct(__CLASS__);
       }
       protected 
    $prop1 'pippo';
       protected 
    $prop2 10;
    }

    class 
    tipo2 extends AbsTipo {
       public function 
    __construct () {
              
    parent::__construct(__CLASS__);
       }
       protected 
    $prop1 'pippo2';
       protected 
    $prop3 100;

    A questo punto posso implementare le classi logiche gestendo i tipi
    come meglio credo

    Codice PHP:
    interface interOper {
              public function 
    evalTipi();
    }

    class 
    operativa1 implements interOper {
          private 
    $tipo null;
          public function 
    __construct() {
                 
    $this->tipo = new tipo1();
          }
          public function 
    evalTipi() {
                 
    $output = array();
                 foreach (
    $this->tipo->listaTipi() as $key)   {
                         
    $output[$key] =  $this->tipo->getTipo($key);
                 }
                 return 
    $output;
          }
    }

    class 
    operativa2 implements interOper {
          private 
    $tipi = array();
          public function 
    __construct() {
                 
    $this->tipi[] = new tipo1();
                 
    $this->tipi[] = new tipo2();
          }
          public function 
    evalTipi() {
                 
    $output = array();
                 foreach (
    $this->tipi as $tipo) {
                         foreach (
    $tipo->listaTipi() as $key)   {
                                 if (!isset(
    $output[$key]))  { // da notare che posso gestire il nome di proprieta' uguali come meglio credo
                                 
    $output[$key] =  $tipo->getTipo($key);
                                 }
                         }
                 }
                 return 
    $output;
          }


    Per finire istanzio tutto
    Codice PHP:
    $operativa = new operativa1();
    var_dump($operativa->evalTipi());

    echo 
    "

    \n\n"
    ;
    $operativa = new operativa2();
    var_dump($operativa->evalTipi()); 

    Spero di esserti stato utile.


    Andrea

  10. #10
    la reflection è molto utile ma veramente veramente lenta!

    http://it2.php.net/runkit

    questo è molto più veloce
    The fastest Redis alternative ... cachegrand! https://github.com/danielealbano/cachegrand

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.