Non è in grado di risolvere una chiamata di funzione alla sua dichiarazione un inconveniente di Polymorphism?

0

Considera una classe che stampa una tabella "schema" per una particolare linea di prodotti. Supponiamo di avere diversi, A, B, C, D. Il meccanismo della generazione della tabella è lo stesso, ma i dati sono diversi. Potrei creare una classe "base" chiamata OutlineTableGenerator e una classe per ogni linea di prodotti che estendono quella classe base. Posso mettere i getter di dati in classi di prodotto individuali e lasciare che la classe di base funzioni sui dati. Osserva di seguito:

class OutlineTableGenerator
{
    protected $vars;

    function __construct($vars)
    {
        $this->vars = $vars;        
    }

    public function getOutlineTable()
    {
        $data = $this->getOutlineTableData();  //my question is about this line
    }
}

e

class OutlineTableGeneratorForProductA extends OutlineTableGenerator
{
    function __construct($vars)
    {
        parent::__construct($vars); 
    }

    protected function getOutlineTableData()
    {
         return ['data' => $this->vars['stuff']];
    }
}

Visualizza la riga $data = $this->getOutlineTableData(); . Il mio problema con questa linea è che il mio IDE, e nessun altro IDE per quella materia, sarà in grado di capire quale classe & funzione che risolverà in fase di esecuzione. Uso abbastanza spesso una funzione per saltare dalla riga nel codice in cui viene chiamata una funzione, alla dichiarazione della funzione effettiva. In questo caso, l'utilizzo di quella funzione sulla linea in questione non salterà alla dichiarazione delle funzioni. Perché ci sono molti di questi, e nemmeno IDE, né il linguaggio di programmazione stesso sa quale funzione voglio. Penso che questo sia male.

C'è un work-around? Questo è un inconveniente del polimorfismo in OO? Come vivi con esso?

    
posta Dennis 15.10.2014 - 23:54
fonte

1 risposta

2

Un fallimento nel polimorfismo? Immagino che dipenda da come usi le classi.

Hai mai istanziato un oggetto OutlineTableGenerator ? Perché mi aspetterei che un tale oggetto causasse un errore fatale se il suo metodo getOutlineTable viene mai chiamato.

Sembra che tu abbia davvero una classe astratta lì; uno che non viene mai istanziato direttamente, ma può essere esteso e utilizzato anche per il suggerimento del tipo all'interno degli elenchi di parametri.

abstract class OutlineTableGenerator {
   ...
    public function getOutlineTable() {
        $data = $this->getOutlineTableData(); //my question is about this line
   }

    abstract function getOutlineTableData();
}

Il mio IDE di solito mi offrirà quindi un elenco di implementazioni ogni volta che seguirò il riferimento per tale chiamata di funzione astratta.

    
risposta data 16.10.2014 - 08:06
fonte

Leggi altre domande sui tag