Newsgroup: it.comp.java
Titolo: Ereditarieta'- Help !!

Salve a tutti
Qualcuno puo' gentilmente aiutarmi ? Sono alle prime armi con java e la
programmazione ad oggetti ed il concetto di ereditarieta' mi č chiaro fino
ad un certo punto.
Il mio problema č il seguente: Immaginate di avere una classe " Militare "
che rappresenti un militare generico delle forze armate italiane. Una classe
denominata " Ufficiale " potrebbe estendere la classe Militare, in quanto
gli ufficiali sono di fatto una categoria di militari ... giusto ? a questo
punto 3 classi denominate: " UfficialeEsercito ", " UfficialeMarina ",
UfficialeAeronautica " potrebbero estendere la classe " Ufficiale "
implementando una " specializzazione " della classe generica " Ufficiale ".
Fin qui' tutto bene !! .. i problemi per il sottoscritto arrivano a questo
punto; Ipotetiche classi " Tenente " , " Capitano " , " Maggiore " e "
Generale " calzerebbero a pennello nella gerarchia appena descritta ( almeno
mi sembra ); Istanze di queste ultime classi sono senza dubbio ufficiali e
quindi anche militari, e potrebbero essere ( e questo č il problema )
ufficiali dell' aeronautica, ma anche dell'esercito o della marina.
Quindi .... le classi " Tenente ", " Capitano " ecc.. ecc.. chi estendono ?
Quale ramo della gerarchia occupano ? potrebbero estendere una qualsiasi
delle classi" UfficialeEsercito ", " Ufficiale Marina " e "
UfficialeAeronautica ". Potrei avere la necessita' di creare un istanza
Tenente dell'esercito, ma altresi' potrei avere il bisogno di creare un
Tenente della Marina ... La classe " Tenente " dunque, dove la " piazzo
"nella gerarchia ?
Spero di aver descritto il mio quesito in modo sufficientemente chiaro e
spero che qualcuno mi aiuti ..
GRAZIE A TUTTI   STEFANO

 "nella gerarchia ?
Dipende molto dal tipo di gerarchia che stai modellando e dal dettaglio che
ti serve rappresentare nella tua soluzione.
Fatti questa domanda: che differenza c'č, nell'ambito del tuo modello, tra
un Tenente della Marina ed uno dell'Esercito?
Se le due entitą TenenteMarina e TenenteEsercito sono, dal tuo punto di
vista, completamente differenti potrebbe essere necessario creare un Tenente
per ogni arma. Mi spiego:
Militare
|
 +--Marina
     --TenenteMarina
 +--Esercito
     --TenenteEsercito
 +--Aeronautica
     --TenenteAeornautica
E' probabile, invece, che tu debba avvalerti delle interfacce come
classificatori per modellare meglio la tua realtą.
Ad esempio potresti creare la tua gerarchia di interfacce:
Ufficiale
|
+--Sottotenente
+--Tenente
+--Capitano
+--Maggiore
e la tua gerarchia di classi:
Militare
|
+--MilitEsercito
+--MilitMarina
+--MilitAeronautica
Quindi un tenente dell'aeronautica sarebbe:
class TenenteAeronautica extends MilitAeronautica implements Tenente;
Comunque se spieghi meglio perchč stai creando tale gerarchia possiamo
entrare nel merito con cognizione di causa.
-- 
Domenico Testa - Studente

 Comunque se spieghi meglio perchè stai creando tale gerarchia possiamo


Potrebbe essere auspicabile derivare da "Difensori" due classi denominate

Ogni realtà può avere differenti interpretazioni e differenti modelli che la
descrivono e la documentano.
Una soluzione poco pulita ma possibile sarebbe specializzare le classi
foglie sia per DifensoreZona che per DifensoreUomo, ottenendo però un
grosso accoppiamento tra le responsabilità del Difensore e quelle del tipo
di gioco implementato.
La domanda che dovresti porti è: in cosa un difensore qualsiasi differisce
da uno che supporta il centrocampo o da uno che va al raddoppio sul
portatore di palla?
Provo a rispondere io per snocciolare l'esempio:
Sappiamo che un difensore si muove() nella zona arretrata del campo col
compito di difendere la porta marcando gli avversari (magari potremmo
modellare un'operazione marca()).
Un difensore a zona si muove()rebbe e marca()rebbe in funzione della
politica difensiva che sta implementando (a zona, a uomo).
Teniamo presente che nel corso della stagione, o addirittura nel corso di
una stessa partita, un giocatore può passare da una difesa ad uomo ad una
difesa a zona (tipico sul finale).
Un buon modo per modellare questa situazione potrebbe essere separare le
responsabilità del Difensore e quelle del tipo di difesa.
+-------------------------+                    +--------------------+
|Difensore                |                    |TipoDifesa          |
|-------------------------|                    |--------------------|
|Difensore(TipoDifesa)    |                    |prossimaMossa() = 0 |                        
|muove()                  |  ---------->       +--------------------+
|marca()                  |
|setTipoDifesa(TipoDifesa)|
|-------------------------|
|tipoDifesa               |
+-------------------------+
Se un difensore non può esistere senza una particolare politica difensiva
possiamo obbligare un link tra i due oggetti in fase di costruzione.
TipoDifesa può essere una classe astratta se ti serve qualche attributo
oppure una semplice  interfaccia se vuoi modellare solo dei metodi.
Nota la relazione di dipendenza tra Difensore.muove(), Difensore.marca() e
TipoDifesa. Il difensore si muoverà a seconda di una serie di percezioni
proprie della classe Difensore e magari in base a prossimaMossa() del suo
particolare TipoDifesa.
Potresti specializzare quindi TipoDifesa in DifesaZona e DifesaUomo.
Così guadagneresti una maggiore separazione delle responsabilità che spesso
si traduce in vantaggi in termini di scalabilità ed estendibilità. Ad
esempio potresti aver bisogno un giorno della famosissima
BiZona ;-) ed inserirla nelle tue tattiche semplicemente
derivando da TipoDifesa e passandola ai tuoi oggetti Difensore.
Discorso analogo possiamo fare per Roberto Carlos e DifensoreMastino.
Possiamo modellare una classe (o una piccola gerarchia di classi) chiamata
magari StileGioco e modellare tutte le possibili combinazioni per un
Giocatore di calcio nel nostro modello nella maniera più sintetica e
dinamica possibile.
Ricorda di circoscrivere le responsabilità di ogni classe e di ogni
gerarchia di classi effettuando una buona divisione dei compiti. Gerarchie
troppo grandi diventano difficilmente comprensibili per noi poveri umani.
Spero di essere stato abbastanza chiaro nel presentare la mia opinione.
