Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2001
    Messaggi
    456

    Domanda teorica su ereditarierà

    Ciao,
    ho un dubbio sull'ereditarietà.
    Vi faccio un esempio assurdo, il primo che mi viene in mente, tanto per farvi capire il concetto.

    Immaginiamo di avere una superclasse Cane nella quale ho come proprietà coloreCorpo, coloreZampe, coloreTesta e coloreCoda.

    Poi creo delle sottoclassi in base alle razze.
    Poi ipotizziamo che venga scoperta una razza di cane che non ha la coda.
    In questo caso la posso ereditare la classe Cane, che ha la proprietà coloreCoda, pur non utilizzandola?.

    Le sottoclassi devono per forza "ampliare" le proprietà dellla superclasse o possono anche "ridurle"?
    Grazie

  2. #2
    Che cosa intendi per properieta' ? una variable membro o un metodo ?

    Comunque in entrambi i casi niente di vieta di subclassare dalla classe Cane e non usare mai la variabile/il metodo coloreCoda all'interno della tua classe. Sempre ammettendo che questa variabile/metodo sia public o protected, altrimenti se e' private proprio non puoi. In ogni caso la memoria per la variabile/metodo della superclasse viene allocata quando chiami super() nel costruttore e non lo puoi impedire.

    Nel caso di un metodo public, se non vuoi che le classi client della tua classe non chiamino il metodo pubblico coloreCoda(), la soluzione piu' elegante da adottare e' lanciare una eccezione a runtime

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    L'ereditarietà non ti consente di eliminare dei campi dalla classe base.
    Al massimo puoi "nasconderli" all'esterno (e non usarli internamente).

    Considera che la costruzione di una classe comporta sempre e comunque la costruzione di un oggetto per ciascuna classe da cui essa eredita. Ciò significa che se l'ipotetica classe CaneSenzaCoda deriva da Cane, alla creazione di un oggetto di tipo CaneSenzaCoda viene automaticamente creato anche un oggetto Cane che verrà associato all'istanza del nuovo oggetto.

    Per nascondere un campo ereditato è sufficiente dichiarare un nuovo campo privato con lo stesso identico nome del campo ereditato (poco importa il tipo del nuovo campo).


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  4. #4
    Originariamente inviato da LeleFT
    Al massimo puoi "nasconderli" all'esterno (e non usarli internamente).
    Ciao.
    Ah questo non lo sapevo. Non si finisce mai di imparare.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2001
    Messaggi
    456
    Grzie per la risposta.

    Io in realtà non volevo eliminare una proprietà della superclasse. Volevo solo sapere se, a livello teorico, è possibile che una sottoclasse NON 'utilizzi' tutte le proprietà della superclasse.

    O se il fatto che una sottoclasse NON 'utilizzi' una (o più) proprietà della superclasse implichi che il concetto di ereditarietà non è stato applicato nel modo giusto.

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    Originariamente inviato da matpirata
    Grzie per la risposta.

    Io in realtà non volevo eliminare una proprietà della superclasse. Volevo solo sapere se, a livello teorico, è possibile che una sottoclasse NON 'utilizzi' tutte le proprietà della superclasse.

    O se il fatto che una sottoclasse NON 'utilizzi' una (o più) proprietà della superclasse implichi che il concetto di ereditarietà non è stato applicato nel modo giusto.
    Il fatto che una sottoclasse non abbia più delle proprietà della superclasse mi fa pensare che qualcosa non va nella gerarchia, che non è pulita al 100% (magari non si avevano le idee chiarissime quando è stata progettata e/o ci sono casi che era impossibile oltre ogni umana ragionevolezza prevedere).

    Riguardo al "nascondere" una property, non l'ho mai vista come una buona pratica, anzi l'ho vista sempre come "possibile portatrice di danni", la considero una soluzione "quando non ce ne sono altre": dovresti essere sicuro che in OGNI punto in cui nella superclasse usi il valore che nascondi, tu nella sottoclasse assegni un valore coerente e la cosa risulta complicata quando non conosci la super-classe.

    Il modo più sicuro per non usare una property è l'override dei metodi, ma devo ammettere che anche questa soluzione presume che tu conosca un minimo la super classe
    RTFM Read That F*** Manual!!!

  7. #7
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Originariamente inviato da matpirata
    Io in realtà non volevo eliminare una proprietà della superclasse. Volevo solo sapere se, a livello teorico, è possibile che una sottoclasse NON 'utilizzi' tutte le proprietà della superclasse.
    Ovviamente sì. Non sei obbligato ad usare tutte le proprietà della superclasse. "Estendere" non significa necessariamente "ampliare il numero di proprietà", ma significa "dotare la nuova classe di funzionalità nuove". Le nuove funzionalità possono anche non richiedere alcuna proprietà in più, ma agire solo su una parte di quelle già esistenti. Le proprietà "non gestite" dalla nuova classe saranno comunque gestite dalla sua superclasse.

    O se il fatto che una sottoclasse NON 'utilizzi' una (o più) proprietà della superclasse implichi che il concetto di ereditarietà non è stato applicato nel modo giusto.
    Ovviamente no, per quanto detto sopra.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  8. #8
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Originariamente inviato da valia
    Riguardo al "nascondere" una property, non l'ho mai vista come una buona pratica, anzi l'ho vista sempre come "possibile portatrice di danni", la considero una soluzione "quando non ce ne sono altre"
    Io non solo non la vedo come una buona pratica, ma non l'ho mai nemmeno usata. Qui mi sono solamente limitato ad indicare che il linguaggio ammette tale possibilità.

    Le volte in cui l'IDE mi avvisava che stavo (involontariamente) nascondendo qualche campo di una superclasse ho sempre provveduto a modificare il nome, ripristinandone la visibilità.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  9. #9
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    Originariamente inviato da LeleFT
    Io non solo non la vedo come una buona pratica, ma non l'ho mai nemmeno usata. Qui mi sono solamente limitato ad indicare che il linguaggio ammette tale possibilità.

    Le volte in cui l'IDE mi avvisava che stavo (involontariamente) nascondendo qualche campo di una superclasse ho sempre provveduto a modificare il nome, ripristinandone la visibilità.


    Ciao.
    siamo in 2 a non averla mai usata
    cmq la mia era solo una precisazione dell'eventuale side-effect che si poteva presentare

    RTFM Read That F*** Manual!!!

  10. #10
    Utente di HTML.it
    Registrato dal
    Jul 2001
    Messaggi
    456
    Ancora grazie a tutti.
    Non avevo visto la risposta di Mr.Bloom. Per proprietà intendo variabili ( il libro su cui sto studiando le chiama così, o forse ricordo male boh)

    (magari non si avevano le idee chiarissime quando è stata progettata e/o ci sono casi che era impossibile oltre ogni umana ragionevolezza prevedere)
    E' proprio di questo che parlavo, Nell'esempio infatti ho ipotizzato che venga scoperta una razza di cani senza coda, cosa che prima di quella scoperta lo sviluppatore non poteva sapere! Quindi da quanto ho capito il caneSenzaCoda può essere una sottoclasse di Cane, senza che io sia 'obbligatorio' poi a sfruttare la varibiale coloreCoda o il metodo muoviCoda(). Ho capito bene?

    Sto parlando in termini teorici, ovvio che non sono obbligato ad usare coloreCoda e muoviCoda() per forza, sto chiedendo se alla luce della scoperta di un cane senza coda, posso comunque estendere la classe Cane ( che prevede la coda) anche per un cane senza coda

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.