Qual è la differenza tra estendere una classe e creare un'istanza di un oggetto di quella classe?

-3

Spesso vedo persone che estendono una classe come questa ad esempio:

public class Bananas extends Fruits {
    public void eatFruit(){

    }
}

anziché

public class Bananas {

    Fruits fruitsObject = new Fruits(); 
        fruitsObject.eatFruit();
}

Qual è la ragione del fare uno piuttosto che l'altro? Mi è stato insegnato a usare il secondo esempio, ma di solito vedo persone che usano il primo esempio.

    
posta 420blazeit 21.03.2016 - 22:38
fonte

2 risposte

2

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.

    
risposta data 22.03.2016 - 00:35
fonte
0

Ti è stato insegnato a usare il secondo esempio? È assolutamente strano Dovresti esaminare ciò di cui hai bisogno in una situazione particolare e usare la cosa che è appropriata in quella situazione.

E sii molto, molto attento con le classi che fingono di imitare gli oggetti della vita reale. Nel tuo caso, inizia con il nome della classe: Frutta? Banane? Potrei considerare di avere una classe in cui un'istanza rappresenta un frutto , ma una classe in cui un'istanza rappresenta frutti ? E poi un'altra classe le cui istanze rappresentano banane ? Non una banana, ma banane ? Questo è uno strano design di classe.

    
risposta data 22.03.2016 - 04:51
fonte

Leggi altre domande sui tag