Suggerimenti x l'ultimo esercizio

Analisi di stringhe
Classe StringTokenizer: supponiamo che l'utente fornisca come argomento di un comando un cammino (path), ad es. chiedendo di cambiare il valore della directory di lavoro facendolo diventare "../Documenti/Progetti/Prog2004". Il cammino compone i nomi di un certo numero di directory, però per potersi effettivamente spostare all'interno del file system sarebbe utile individuare le sottostringhe corrispondenti ai nomi delle singole directory. A tal fine è possibile utilizzare la classe (predefinita) StringTokenizer. I passi da seguire sono: (1) creare un oggetto StringTokenizer per la stringa da analizzare, passando come argomento anche la sottostringa (eventualmente costituita da un solo carattere) che funge da delimitatore delle voci da individuare (es. "/"); (2) applicando all'oggetto creato il metodo nextToken() si ottiene una sottostringa di quella di partenza, quella che va dal primo carattere alla prima occorrenza del delimitatore (es. nel nostro caso ".."). Applicando più volte questo metodo si ottengono via via tutte le sottostringhe di interesse (es. "Documenti", poi "Progetti", ecc.). (3) Per verificare se in una stringa rimangono degli elementi da estrarre, si può utilizzare il metodo hasMoreElements(), applicato allo StringTokenizer creato.

FileSystem e MyDirectory
Riguardo l'implementazione della classe FileSystem come estensione di MyDirectory, è vietato definire come variabile di istanza di tale classe una variabile di classe MyDirectory, destinata a contenere la radice del file system! Il motivo è che non occorre perché esiste già ...

Pensate al seguente esempio: invece di considerare file e directory, consideriamo qualcosa di più intuitivo: gli esseri umani. Supponete di avere una classe Umano, che estendete da un lato per definire la classe Uomo e dall'altro per definire la classe Donna. A livello intuitivo siamo tutti d'accordo che tutti gli Uomini e tutte le Donne sono Umani, mentre chiaramente non si può dire che tutti gli Umani sono Uomini (o che sono tutti Donne). Si tratta di un concetto più generale, di cui gli altri due rappresentano dei sottoinsiemi. Estendere significa infatti aggiungere qualcosa alla descrizione e ogni volta che si aggiunge dell'informazione si restringe (si specializza) l'insieme degli elementi che la verificano (per es. gli uomini biondi sono un sottoinsieme degli uomini, i bassotti sono un caso particolare di cani, gli alberi da frutto sono un sottoinsieme degli alberi). Quindi se posso sempre dire che un oggetto che verifica la definizione più restrittiva (ovvero quella estesa) verifica anche quella più generale (che contiene meno condizioni), non si può sempre dire che è vero il contrario. Tornando al nostro esempio, ogni Uomo sarà anche un Umano ma non è vero che ogni Umano è un Uomo (alcuni Umani saranno Donne).

L'implementazione delle classi tramite estensione (in java) rispetta gli stessi principi intuitivi? Ovvero: tutti gli oggetti di classe Uomo sono anche oggetti di classe Umano? O in altri termini: se ho una variabile di tipo Umano posso assegnarle come valore un oggetto di tipo Uomo (o di tipo Donna)?
Ciò corrisponde a domandarsi: posso -in qualche caso specifico- considerare un oggetto di una certa classe estesa solo per quegli aspetti definiti nella sua sopraclasse? La risposta è sì. Quello che non posso mai per nessun motivo fare è interpretare un oggetto istanza di una classe come se fosse istanza di una classe che estende la precedente (interpretare un cane necessariamente come un bassotto).

Veniamo infine a FileSystem e MyDirectory. La prima classe estende la seconda, questo significa che un oggetto istanza di FileSystem è anche una MyDirectory. La domanda a cui vi chiedo di rispondere è: posso assegnare a una variabile di tipo MyDirectory (per esempio quella in cui memorizzate la directory di lavoro) un oggetto istanza di FileSystem (magari identificato da un this)? Tornando all'esempio: posso assegnare a una variabile di tipo Umano un oggetto di tipo Uomo?