La corrispondenza dell'elenco dei parametri del costruttore della superclasse sta trattando un valore predefinito nullo come un valore non nullo all'interno di un costruttore una violazione di LSP? [duplicare]

0

In qualche modo mi sono imbattuto in questo quando ho problemi con FlashPunk, e lo userò come esempio.

Essenzialmente la classe sprite principale è praticamente la classe Entity . Il costruttore di Entity's ha quattro parametri, ciascuno con un valore predefinito. Uno di questi è graphic , il cui valore predefinito è null.

Entity è progettato per essere ereditato da, con molte sottoclassi di questo tipo che forniscono il proprio grafico all'interno dei propri meccanismi interni. Normalmente queste sottoclassi non hanno graphic negli elenchi dei parametri del costruttore, ma semplicemente selezionano qualcosa internamente e vanno con esso.

Tuttavia stavo cercando di aderire al Principal della sostituzione di Liskov, che mi ha portato all'esempio seguente:

package com.blank.graphics 
{
    import net.flashpunk.*;
    import net.flashpunk.graphics.Image;

    public class SpaceGraphic extends Entity
    {
        [Embed(source = "../../../../../../assets/spaces/blank.png")]
        private const BLANK_SPACE:Class;

        public function SpaceGraphic(x:Number = 0, y:Number = 0, graphic:Graphic = null,
                mask:Mask = null)
        {
            super(x, y, graphic ? graphic : new Image(BLANK_SPACE), mask);
        }
    }
}

Bene, ora c'è una lista di parametri nel costruttore che corrisponde perfettamente a quella del costruttore della super classe. Ma se viene utilizzato il valore predefinito per graphic , mostrerà due comportamenti diversi, a seconda che tu stia utilizzando la sottoclasse o la superclasse. Nella superclasse, non ci sarà un grafico, ma nella sottoclasse, sceglierà il grafico predefinito.

Si tratta di una violazione del Principato di sostituzione di Liskov? Il fatto che le sottoclassi abbiano quasi l'intenzione di utilizzare diversi elenchi di parametri ha qualche rilevanza? Minimizzare l'elenco dei parametri potrebbe violarlo in un caso come questo? Grazie.

    
posta Panzercrisis 13.06.2014 - 04:14
fonte

1 risposta

5

No, non è una violazione dell'LSP. L'LSP dice che le istanze di un sottotipo dovrebbero essere sostituibili in modo sicuro per le istanze del tipo genitore (cioè la costruzione dopo ). Non importa come vengono costruiti.

    
risposta data 13.06.2014 - 05:53
fonte