Visualizzazione dei risultati da 1 a 9 su 9

Discussione: Polimorfismo

  1. #1
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,609

    Polimorfismo

    Ciao a tutti

    domanda, forse banale. Ho questa situazione:
    codice:
    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

  2. #2
    Utente di HTML.it L'avatar di Misterxxx
    Registrato dal
    Oct 2003
    Messaggi
    3,658
    a me pare che manchi parecchia roba a queste classi costruttore (almeno uno), setter (getter) ...
    Io ne ho viste cose che voi umani non potreste immaginare. Navi da combattimento in fiamme al largo dei bastioni di Orione e ho visto i raggi B, balenare nel buio vicino le porte di Tannhäuser. E tutti quei momenti ... andranno ... perduti nel tempo, come lacrime nella pioggia. È tempo di morire. (Roy Batty).

  3. #3
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,609
    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) ?

  4. #4
    Utente di HTML.it L'avatar di Misterxxx
    Registrato dal
    Oct 2003
    Messaggi
    3,658
    Quote Originariamente inviata da boots Visualizza il messaggio
    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
    Io ne ho viste cose che voi umani non potreste immaginare. Navi da combattimento in fiamme al largo dei bastioni di Orione e ho visto i raggi B, balenare nel buio vicino le porte di Tannhäuser. E tutti quei momenti ... andranno ... perduti nel tempo, come lacrime nella pioggia. È tempo di morire. (Roy Batty).

  5. #5
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,609
    Bhe...quello è il codice, mi pareva abbastanza chiaro :-)
    Stavo vedendomi un po' java e mi era venuto questo dubbio. cmq l'esempio completo sarebbe:

    codice:
    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
    Ultima modifica di boots; 06-06-2021 a 12:41

  6. #6
    Utente di HTML.it L'avatar di Misterxxx
    Registrato dal
    Oct 2003
    Messaggi
    3,658
    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
    Io ne ho viste cose che voi umani non potreste immaginare. Navi da combattimento in fiamme al largo dei bastioni di Orione e ho visto i raggi B, balenare nel buio vicino le porte di Tannhäuser. E tutti quei momenti ... andranno ... perduti nel tempo, come lacrime nella pioggia. È tempo di morire. (Roy Batty).

  7. #7
    Quote Originariamente inviata da boots Visualizza il messaggio
    codice:
    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.
    Ultima modifica di andbin; 07-06-2021 a 09:45
    AndreaSenior Java developerSCJP 5 (91%) – SCWCD 5 (94%)
    Il mio nuovo sito-blog italiano sulla programmazione: andbin.it

  8. #8
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,609
    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:

    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:
    codice:
    class XComponent extends Component{
         public XComponent(){
             this._id = 'X';
         }
    }
    
    ...
    
    Component x = new XComponent();
    x.loadConfig();
    C'� qualcosa di pi� semplice in java?

  9. #9
    Utente di HTML.it L'avatar di Misterxxx
    Registrato dal
    Oct 2003
    Messaggi
    3,658
    ... temo tu debba rivedere "un po' meglio" come è strutturata e come funziona una classe java ...
    Io ne ho viste cose che voi umani non potreste immaginare. Navi da combattimento in fiamme al largo dei bastioni di Orione e ho visto i raggi B, balenare nel buio vicino le porte di Tannhäuser. E tutti quei momenti ... andranno ... perduti nel tempo, come lacrime nella pioggia. È tempo di morire. (Roy Batty).

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2021 vBulletin Solutions, Inc. All rights reserved.