PDA

Visualizza la versione completa : Polimorfismo


boots
05-06-2021, 20:22
Ciao a tutti

domanda, forse banale. Ho questa situazione:



class Babbo{
public String Nome = "Babbo";
}

class Figlio extends Babbo{
public String Nome = "Figlio";
}

Babbo iBabbo = new Figlio();


iBabbo.Nome = "Babbo".
Mi pare di aver letto che il polimorfismo in java non "riguarda" le variabili ma solo i metodi.
Come faccio a far prendere "Figlio" a iBabbo, senza giocare con il costruttore che vorrei rimanesse senza parametri ?

Grazie

Misterxxx
05-06-2021, 21:51
a me pare che manchi parecchia roba a queste classi :confused: costruttore (almeno uno), setter (getter) ...

boots
05-06-2021, 22:29
E' ovvio che manca tutto...ma non il punto
Per esempio in php iBabbo->Nome avrebbe restituito "figlio"
C' un modo in java per sovrascrivere la variabile senza settarla in modo esplicito o passare dal costruttore (super) ?

Misterxxx
06-06-2021, 08:35
E' ovvio che manca tutto...ma non il punto
Per esempio in php iBabbo->Nome avrebbe restituito "figlio"
C' un modo in java per sovrascrivere la variabile senza settarla in modo esplicito o passare dal costruttore (super) ?
come regola, si posta un codice funzionante, non brandelli di codice
il motivo lo intuisci da solo se ti poni dal lato di chi legge

boots
06-06-2021, 12:32
Bhe...quello il codice, mi pareva abbastanza chiaro :-)
Stavo vedendomi un po' java e mi era venuto questo dubbio. cmq l'esempio completo sarebbe:



component.java:
packege Components;
public class Component{
public String _id = "Base";
public Component(){this.load();}
protected void load(){
// Qua devo usare _id...ma quello della derivata
}
}

Xcomponent.java:
packege Components;
public class XComponent extends Component{
public String _id = "X";
public XComponent(){super();}
}

nel main:
Component x = new XComponent();
System.out.println(x._id);


mi viene stampato "Base"...invece io vorrei "X".


Come faccio a fargli prendere la variabile della classe derivata, senza assegnarla esplicitamente, come accade in PHP?

Ovviamente potrei "settarla" nel costruttore di XComponent, ma mi viene detto che super()va prima di tutto
Spero di essere chiaro
Grazie

Misterxxx
06-06-2021, 14:29
super() il richiamo al costruttore padre, ma ogni classe pu avere pi costruttori (purch firmati diversamente)
non voglio entrare nel merito del "perch" vuoi costruttore vuoto, comunque la variabile deve essere richiamata dal corrispondente metodo getter

andbin
07-06-2021, 09:38
Component x = new XComponent();
System.out.println(x._id);

Il principio del override, derivante dall'uso di ereditariet/polimorfismo, si applica SOLO ai metodi di istanza. Non alle variabili.

x._id ---> x una variabile di tipo Component (NON importa ora se gli assegni un XComponent), quindi il _id referenziato esattamente e solamente quello di Component e non pu essere altro.

boots
07-06-2021, 15:02
Grazie della risposta.
E' quello che avevo letto riguardo al polimorfismo in java. Per� mi chiedevo se c'� un modo semplice per far prendere quel valore.
Mi spiego meglio: mi son reso conto che ogni metodo load delle classi derivate fanno la stessa cosa (leggere una conf da file), quello che cambia � il file.
Quindi ho spostato il metodo dentro Component, sperando che quel _id (che uso come nome del file di conf) cambiasse con la l'istanza derivata.
In codice:



class Component{
protected String _id;

public Component(){
String fileName = "configs/component_" + this._id + ".xml";
// Leggo il file etc
}
}

Quindi nelle classi derivate impostavo solo quel _id, cos� al momento della creazione dell'oggetto caricava la sua configurazione.
Avevo pensato anche di impostare _id nel costruttore (della derivata), ma super() deve essere la prima istruzione, il che rende inutile la cosa.
Per adesso ho "risolto" spostando la lettura della configurazione su un altro metodo ed impostando l'_id nel costruttore, ma devo chiamare esplicitamente la lettura del file:


class XComponent extends Component{
public XComponent(){
this._id = 'X';
}
}

...

Component x = new XComponent();
x.loadConfig();


C'� qualcosa di pi� semplice in java?

Misterxxx
07-06-2021, 18:54
... temo tu debba rivedere "un po' meglio" come strutturata e come funziona una classe java ...

Loading