I tuoi due esempi definiscono due diversi modi di combinare banane e frutta.
Nel tuo primo esempio le banane sono un tipo di frutta in quanto hanno tutte le caratteristiche dei frutti come parte di se stessi e tutte le caratteristiche che decidi di aggiungere specificamente alle banane. Se dovessi passare un oggetto Bananas a una funzione potresti passarlo a una funzione in attesa di una banana o, come molti programmatori trovano più utile, potresti passare il tuo oggetto Bananas a una funzione che aspetta un frutto! (Potresti anche definire Mele, Pere ecc. E passare quelli alla stessa funzione!)
Nel tuo secondo esempio le banane contengono un frutto e concettualmente non sono frutti. Con questo concetto non è possibile aggiungere alle caratteristiche dei frutti come è rappresentato all'interno delle banane. Queste funzioni sono impostate quando è stata creata la classe Fruits. Potresti, tecnicamente, accedere ai Frutti all'interno dei tuoi oggetti istanziati di Bananas e quindi avere accesso alle caratteristiche pubbliche di Frutti come parte del tuo oggetto Bananas ma dovresti voler passare un oggetto di classe Bananas ad una funzione che la funzione avrebbe in particolare aspettarsi una banana ... non una frutta. (Se dovessi definire Mele, Pere e simili, non potresti passarli alla tua funzione in quanto accetta solo banane.)
Se è per questo, nel tuo primo esempio crei una nuova funzione all'interno di Bananas mentre nel tuo secondo esempio stai semplicemente CHIAMANDO una funzione chiamata eatFruit che esisteva già in Fruits.