melixo ha scritto:
Al di là dell'aver capito l'utilizzo di public, private, protected, le visibilità in generale, e anche le estensioni delle classi... mi viene da chiedere perché esistono effettivamente?
Esistono per poter essere applicate, altrimenti direi che non ci hai capito nulla.
melixo ha scritto:
Ma se sono io a programmare, e la dichiarassi public e in nessuna parte del programma la modificassi, perché dichiararla private se non ho intenzione di modificarla? Ma se anche la dichiarassi private e non avessi comunque intenzione di modificarla, perché private?
E se una variabile si chiamasse "Cliente" e io ci metto il nome di un "Fornitore", perché dovrei chiamarla invece "Fornitore" se io so che ci ho messo dentro un cliente? Del resto, io lo so, quindi sarebbe lo stesso, no?
A parte il fatto che tu stia uno sviluppatore individuale, ciò non significa che non userai mai software scritto da terzi, né che la tua memoria a distanza di mesi non vacilli, ma tralasciando questo fattore le visibilità servono per applicarle alle architetture in modo da garantire che ciò che si è voluto rendere privato e/o pubblico lo sia senza possibilità di errore.
melixo ha scritto:
Mi viene da chiedere: "C'è il rischio che il programma la modifichi a mia insaputa e per evitare il rischio la dichiaro private?"
Il programma lo scrivi tu: è il tuo codice che deve rispettare le regole che tu stesso hai imposto per poter essere compilato.
A qualcosa di "privato" si può opzionalmente arrivare anche tramite Reflection e con altri meccanismi: non è un sistema di protezione o di sicurezza, ma un sistema architetturale.
melixo ha scritto:
Stessa cosa per le estensioni. Perché esistono? Perché ho una classe A e dovrei creare classe B per estendere A invece che mettere tutto in A?
Nessun motivo, infatti il tuo esempio è sbagliato. Non devi mettere tutto in A o tutto in B, oppure tutto in C, ma hai la possibilità di "derivare" da A mettendo in essa ciò che è comune in B e in C (se ha senso farlo, ovviamente).
melixo ha scritto:
Non capisco in quali contesti si possa avere la necessità di estendere una classe invece che inserire tutto in una.
Se è possibile individuare tra diverse classi un fattore comune, devi piuttosto chiederti perché negarsi il vantaggio di scrivere quel codice una volta sola.
melixo ha scritto:
È per una questione di ordine, di leggibilità?
Serve per evitare duplicazioni inutili del codice, serve per semplificare l'individuazione di un bug e impedire di replicarlo ovunque, serve per imbastire una architettura solida sulla quale sviluppare i successivi pezzi di software.
melixo ha scritto:
Anche il fatto di creare una classe astratta e per utilizzarla ne devo creare una per poterla estendere. Che senso ha?
Non si può direttamente creare la classe normalmente invece che definirla astratta?
E' inutile chiedersi quanto può essere utile un rastrello ipotizzando lo scenario in cui devi spazzare in casa: si può fare tutto quello che dici, ma ti stai chiedendo l'utilità di una cosa in un contesto dove quella non è necessaria.
Fossi in te, rileggerei tutto e cercherei qualche esempio anche online per comprendere meglio magari con un approfondimento i concetti che dici di aver compreso ma dei quali continui a proporre gli unici scenari in cui non sono utili, o vederli come obbligo piuttosto che come opportunità.