Principio di Liskov con diversi parametri del costruttore

1

La mia prima domanda è, il principio di Liskov è applicato anche sulla dichiarazione del costruttore?

Voglio dire, sono obbligato ad avere esattamente lo stesso numero / tipo di parametri nel mio costruttore per ciascuna (diversa) classe?

Guardando questo:

package com.apptest.test;

public class Application {

    public static void main(String[] args) {
        IRepository r = new RepositoryUser("toto");
        IRepository x = new BillingRepository("billing","super");

    }

}

Possiamo vedere che ci sono due implementazioni di IRepository, ma uno usa un altro parametro.

È corretto, e posso dire che il principio di Liskov è rispettato?

    
posta Thomas thomas 13.11.2015 - 08:28
fonte

2 risposte

5

Come puoi già aver intuito, il costruttore della tua classe di implementazione non partecipa all'API dell'interfaccia. In effetti, non vorrai che il costruttore faccia parte dell'interfaccia. Fare ciò significherebbe che la tua interfaccia avrebbe una conoscenza di come la classe viene istanziata, il che quasi sicuramente sventerebbe modelli di design come Abstract Factory, Service Locator e Dependency Injection.

No, vuoi che la tua interfaccia sia indipendente dal costruttore, in modo che tu possa istanziare la classe di implementazione in qualsiasi modo tu ritenga opportuno, sia attraverso una Constructor, usando Reflection, o facendo uso di un contenitore IoC.

    
risposta data 13.11.2015 - 08:32
fonte
1

Il principio di sostituzione di Liskov si riferisce in realtà al comportamento più che altro. I sottotipi di una classe dovrebbero estendere la funzionalità ma solo in modi che non interrompano la funzionalità corrente nel contesto del tuo programma.

A questo proposito, i metodi e i costruttori possono assumere parametri aggiuntivi. Il trucco è che potresti utilizzare RepositoryUser e BillingRepository come IRepository istanze intercambiabili in tutto il tuo programma e dovrebbero essere entrambi utilizzati allo stesso modo. La differenza, dove conta, dovrebbe essere nei dettagli di implementazione e da nessun'altra parte.

La costruzione di un'istanza dovrebbe anche seguire il principio di Liskov, ma solo nel caso in cui il costruttore stia eseguendo una logica propria (metodi di chiamata e simili). Tuttavia, di solito è meglio evitare di farlo nel costruttore, e se questo è il tuo caso, non devi preoccuparti di come l'istanza viene istanziata per quanto riguarda il principio di Liskov.

    
risposta data 13.11.2015 - 08:37
fonte