Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    ereditarietà e late binding

    Buongiorno a tutti,
    mi sto cimentando da poco con l' OOP, e mi ritrovo con un problema da risolvere che potrebbe essere anche banale, ma non ne vengo fuori.
    Immaginiamo un database molto semplificato di animali e analizziamone la singola tabella:

    id : (int autoincrement)
    nome :
    tipo : (cane o gatto)

    e vediamo la base delle 3 classi:
    Codice PHP:
    <?php
    class animali
    {
        public function 
    verso()
        {
            echo 
    "...";
        }
    }

    class 
    cane extends animali
    {
        
        public function 
    verso()
        {
            echo 
    "Bau !";
        }
    }

    class 
    gatto extends animali
    {
        public function 
    verso()
        {
            echo 
    "Miao !";
        }
    }
    vorrei caricare a livello di compilazione la classe animale che si trasformi nella classe specifica a livello di run-time.

    E' possibile farlo secondo voi? magari a livello di __construct?

  2. #2
    Utente di HTML.it L'avatar di Secta
    Registrato dal
    May 2002
    Messaggi
    365
    Stai sbagliando approccio... cane e gatto ereditano da animali... quindi a seconda del caso devi istanziare l'una delle due e accedi a metodi e proprietà della classe animale.

    Se poi il tuo è un problema diverso... ossia non sai quale delle due istanziare e (semplificando) ti serve una classe che decida cosa fare allora dai un'occhiata ai vari "factory pattern".
    "Dai diamanti non nasce niente, dal letame nascon fiori."
    Fabrizio De Andrè

  3. #3
    Esatto, immaginiamo di "ciclare" l'intera tabella di animali e di far emettere il verso giusto ad ogni animale senza sapere qual'è e in ordine sparso.
    Teoricamente i framework lo fanno in automatico (tipo doctrine in symfony), però, testardo come sono, vorrei riprodurre il tutto in forma semplificata senza il supporto del framework per capire come si fa.



    PS ho provato una cosa del genere nel construct della classe base, ma non funziona, o meglio non da errori di sintassi, mi istanzia una classe cane che però non riesco ad assegnare alla mia istanza base creata.

    Codice PHP:
    public function __construct($id)
        {
            
    //Dall'id ricavo il record dell'animale e il relativo tipo
            
    $tipo="cane";//teoricamente andrebbe ricavato dal DB
            
    if ($tipo=="cane")
                {
                    return new 
    cane;
                }
            else if (
    $tipo=="gatto")
                {
                    return new 
    gatto;
                }
            
        } 

  4. #4
    Utente di HTML.it L'avatar di Secta
    Registrato dal
    May 2002
    Messaggi
    365
    Andiamo per gradi. Per istanziare uno tra i tanti oggetti possibili, ti consiglio nuovamente di dare un'occhiata ai vari "factories pattern".

    Per quanto riguarda il far emettere il verso giusto... potresti spiegarti meglio? non ho ben capito cosa intendi... il db come sarebbe strutturato? ad ogni animale corrisponde un verso... o ad ogni verso possono corrispondere più animali? (ad es... credo che sia il topo che lo scoiattolo squittiscano )
    "Dai diamanti non nasce niente, dal letame nascon fiori."
    Fabrizio De Andrè

  5. #5
    Allora provo a spiegarmi meglio.
    Prendiamo in considerazione il dadabase così strutturato:

    codice:
    id : (int autoincrement)
    nome :
    tipo : (cane o gatto)
    e facciamo finta che contenga solo Cani e Gatti in modo da semplificare ulteriormente.

    Il verso è contenuto nel metodo di ogni oggetto specifico come specificato nel primo post.
    Quindi il metodo "verso" del cane stamperà "Bau !" mentre quello del gatto "Miao !".

    Il mio problema è che ciclando l'intera tabella degli animali, vorrei richiamare una classe generica (animale) che mi crei invece automaticamente l'istanza specifica corretta in base all'attributo "tipo" contenuto nel database.

    Spero di essermi spiegato meglio

    PS ad ogni modo sto cercando di capire di più' sul Factory Pattern.
    Sembra che sia la soluzione al mio problema, anche se non trovo una fonte con esempi semplici per poterci capire di più.
    Soprattutto se poi i vari Prodotti finali creati dal Factory, possano estendere magari una libreria simil ORM semplificata (non Doctrine e company per intenderci ma una ORM semplice di natura "casereccia" ) per poter essere integrata in progetti reali. Ma questo è un altro discorso

    Ad ogni modo grazie mille per l'aiuto che mi stai dando.

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.