Non esiste "LA RISPOSTA"!
1) si
2) ovviamente! Non ha senso generare classi per qualunque cosa, come NON HA SENSO avere classi con N-milioni di metodi ed M-miliardi di righe di codice. Va tutto calibrato, oppurtunamente suddiviso e compartimentato
3) esattamente: una delle comodita' della programmazione ad oggetti e' esattamente questa: la "virtualizzazione" dei metodi. Sai che c'e', sai che ritorna quello che deve ritornare, non ti serve sapere come lo fa.
La programmazione ad oggetti e' ben piu' articolata della sola ereditarieta'.
Come MINIMO devi iniziare a comprendere che cosa e' una
interfaccia (esistono in Java, in C#, ed anche in C++ seguendo opportune regolette
filosofiche/
di stile, in Python, ecc)
e cosa sono i
design patterns:
https://en.wikipedia.org/wiki/Software_design_patter
Comunque NON ECCEDERE, di concetti c'e' ne sono a camionate, e per digerirli non ti basta l'Alka Seltzer o il Digestivo Antonietto
Serve tempo e pratica. A mia conoscenza, non ci sono scorciatoie