Estensione ed implementazione

di il
4 risposte

Estensione ed implementazione

Buonasera a tutti....piccolo quesito di teoria:
A=classe
B=classe
C=interfaccia
Se B implementa C e A estende B, allora anche A deve implementare C? e quindi fare override di tutti i metodi di C?
Il dubbio mi è venuto studiando il pattern decorator.

4 Risposte

  • Re: Estensione ed implementazione

    No
  • Re: Estensione ed implementazione

    Friz02 ha scritto:


    Se B implementa C e A estende B, allora anche A deve implementare C?
    Tecnicamente A è-un B, quindi è anche vero che A è-un C. Insomma la relazione IS-A classica dovuta alla ereditarietà.

    Friz02 ha scritto:


    e quindi fare override di tutti i metodi di C?
    No, non necessariamente. Dipende ..... B implementa già tutti i metodi di C? L'obiettivo di A è di cambiare qualcosa da B in uno di quei metodi? B è astratta e non implementa alcuni dei metodi di C? (quindi è A che deve farlo). Oppure B è ancora astratta e implementa tutti i metodi di C ma ne espone altri, astratti, che una sottoclasse è obbligata a implementare?

    Insomma, dipende dallo scenario specifico.

    Friz02 ha scritto:


    Il dubbio mi è venuto studiando il pattern decorator
    Il pattern decorator non usa solo la relazione IS-A ma anche e soprattutto la relazione HAS-A. Un "decoratore" ha (contiene) il riferimento ad un altro oggetto del suo stesso tipo o in senso più generale e tipico di un super-tipo.
  • Re: Estensione ed implementazione

    Quindi se ho ben capito:
    1) se B non implementa (tutti o alcuni) i metodi di C (in tal caso B deve essere definita astratta) allora A deve per forza implementare tutti i metodi di C che B non ha implementato;
    oppure
    2) se B non è definita astratta deve implementare tutti i metodi di C e non può esporne altri (metodi) astratti da far implementare ad A (in questo caso A non riscrive nessun metodo di B o C).
    Ne deduco che A potrebbe (anzi deve) implementare (tutti o alcuni) i metodi di C solo se B è definita astratta e non implementa (tutti o alcuni) i metodi di C (in tal caso A dovrà implementare tutti i metodi di C che B non ha implementato...cioè quanto detto al p.to1).
    Ovviamente A non deve essere astratta.

    Giusto?...
  • Re: Estensione ed implementazione

    Friz02 ha scritto:


    1) se B non implementa (tutti o alcuni) i metodi di C [...] allora A deve per forza implementare tutti i metodi di C che B non ha implementato;
    Esatto.

    Friz02 ha scritto:


    (in tal caso B deve essere definita astratta)
    Esatto. Se non li implementa tutti, questa è la precondizione, ovvero: essere astratta.

    Friz02 ha scritto:


    2) se B non è definita astratta deve implementare tutti i metodi di C
    Esatto.

    Friz02 ha scritto:


    e non può esporne altri (metodi) astratti da far implementare ad A
    Esatto. Se B è "concreta" (non astratta) non può avere metodi abstract. E non può neanche obbligare una sottoclasse a ridefinire/implementare qualcosa.

    Friz02 ha scritto:


    (in questo caso A non riscrive nessun metodo di B o C).
    Se i metodi concreti in B non sono final, allora A può (cioè ne ha facoltà) ridefinirli.

    Friz02 ha scritto:


    Ne deduco che A potrebbe (anzi deve) implementare (tutti o alcuni) i metodi di C solo se B è definita astratta e non implementa (tutti o alcuni) i metodi di C (in tal caso A dovrà implementare tutti i metodi di C che B non ha implementato...cioè quanto detto al p.to1).
    Ovviamente A non deve essere astratta.
    Esatto. Se A è "concreta", nulla deve rimanere "incompleto".

    Quando vedi abstract pensa "incompleto". Se una classe è "concreta" (non abstract), tutto deve essere implementato in modo che non ci sia più nulla di incompleto.
Devi accedere o registrarti per scrivere nel forum
4 risposte