salve a tutti. ho un dubbio riguardo l'ereditarietà:
c'è un modo per far si che alcuni attributi della classe padre non vengono ereditati dalle classi figlie?
grazie a tutti per l'aiuto
salve a tutti. ho un dubbio riguardo l'ereditarietà:
c'è un modo per far si che alcuni attributi della classe padre non vengono ereditati dalle classi figlie?
grazie a tutti per l'aiuto
"attributo" è un termine un po' generico. O si parla di variabili di istanza o di metodi di istanza.
E comunque "ereditare" in una sottoclasse alla fin fine significa poter "vedere" quel certo membro (campo o metodo che sia) della super-classe. E quindi dipende solo dal livello di accesso ed eventualmente dalla disposizione dei package (se il membro ha il livello default o protected).
Un campo/metodo private NON è mai "ereditato".
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet
Giusto, non la "eredita" nel senso che la variabile private B non la vede proprio.
Dal Java Language Specification:
A private class member or constructor is accessible only within the body of the top level
class (§7.6) that encloses the declaration of the member or constructor. It is not inherited
by subclasses.
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet
allora detto ciò meglio che spiego qual'è il mio problema perchè veramente nn sto ricavando un ragno da un buco.
Ho una classe "procelement" ,che viene estesa da circa 2 classi: Task; SendTask. Mi viene chiesto di implementare un metodo "crea array" di una classe "Prova"(avente come variabili ArrayList<Task>; ArrayList<SendTask>") in cui devo costruire un arraylist di procelement. Questo deve essere utilizzato da un altro metodo(chiamato "populate") in modo da verificare che tipo di oggetto è e poterlo inserire nell'arrayList specifo a quell'oggetto. come posso fare per fare questo? io ho pensato di creare l'oggetto nella classe procelement inserirlo in un arrayList di proclement e passarlo al metodo populate che verifica di che istanza è gli oggetti nell'arrayList solo che non mi fa aggiungere (giustamente) un oggetto di tipo procelement nell'arrayList<Task>/arrayList<SendTask>
Ultima modifica di simo9115; 03-05-2016 a 11:08
Scusa ma così non ha molto senso (né è granché chiaro). Se un ArrayList è parametrizzato <Task> o <SendTask> e questi due tipi sono sotto-tipi di questa ProcElement (o come l'hai chiamata) .... allora vuoi dire che il ArrayList così parametrizzato NON può contenere oggetti istanziati come ProcElement.
ArrayList<Task> può solo contenere oggetti Task o sotto-tipi di Task. Non qualcosa che è un super-tipo di Task.
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet
Rileggendo questa frase, allora la questione è questa. Innanzitutto non so se la ProcElement è astratta o no. E se non lo è, se andrai ad istanziare oggetti ProcElement.
Se i tuoi oggetti istanziati sono solo dei Task o SendTask e un tuo metodo li "vede" solo come tipo ProcElement (insomma a livello più generico), allora può avere senso andare a verificare che tipo di oggetto è realmente (Task o SendTask), quindi fare un cast e inserirlo nel rispettivo ArrayList. Questo sì, è possibile. Se un oggetto è realmente un Task, allora ha senso ed è lecito metterlo in un ArrayList<Task> !
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet
ti posto il codice così capisco meglio:
ora come lo dovrei scrivere il cast?codice:public void populate(ArrayList<ProcElement> ListProcElem) { for(int i=0; i<ListProcElem.size(); i++) { if(ListProcElem.get(i) instanceof Task) { this.Task.add(ListProcElem.get(i)); }else if(ListProcElem.get(i) instanceof SendTask) { SendTask sendtask1 = new SendTask(); this.SendTask.add(sendtask1); } }
Ti suggerisco di:
- NON mettere variabili (di istanza o altro che siano) che hanno lo stesso identico nome di una classe. Ovvero quei campi potresti chiamarli es. sendTasks o sendTaskList ma non SendTask
- usare il for-each, che ti semplifica un pochino
Per fare un cast: (Tipo) valore
Infine, non ho capito perché nel secondo caso istanzi un nuovo SendTask. Non lo devi mica istanziare ... devi usare l'oggetto i-esimo.
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet