Homepage  Il progetto dsy.it è l'unofficial support site dei corsi di laurea del Dipartimento di Scienze dell'Informazione e del Dipartimento di Informatica e Comunicazione della Statale di Milano. E' un servizio degli studenti per gli studenti, curato in modo no-profit da un gruppo di essi. I nostri servizi comprendono aree di discussione per ogni Corso di Laurea, un'area download per lo scambio file, una raccolta di link e un motore di ricerca, il supporto agli studenti lavoratori, il forum hosting per Professori e studenti, i blog, e molto altro...
In questa sezione è indicizzato in textonly il contenuto del nostro forum


.dsy:it. .dsy:it. Archive > Didattica > Corsi A - F > Fondamenti di architettura e programmazione
 
esercizio UML
Clicca QUI per vedere il messaggio nel forum
Paul442
Ciao, avrei bisogno di chiedere una cosa che non hoi capito:
negli esercizi UML degli esami nel caso non trovassi un metodo nella classe appena sopra, posso usare metodi anche della classe due posti in su?
faccio un esemio:
se la gerarchia è A <- B <- D se io sono in D posso usare metodi che si trovano anche nella classe A oltre che nella classe appena sopra (ovvero la B) ?

Grazie

zack1988
Ciao,
A <- B <- C visto che B eredita i metodi di A anche C gli eredita, come test ho provato usando java:
PHP:

public class {
    public 
void metodoA() {
        
System.out.println(&quot;METEODO A&quot;);
    }
}

public class 
extends {
    public 
void metodoB() {
        
System.out.println(&quot;METODO B&quot;);
    }
}

public class 
extends {
    public 
void metodoC() {
        
System.out.println(&quot;METODO C&quot;);
    }
}

public class 
Test {
    public static 
void main(String [] args) {
        
C istanzaC = new C();
        
istanzaC.metodoA();
        
istanzaC.metodoB();
        
istanzaC.metodoC();
    }
}


Paul442
Grazie mille della risposta quindi se per esempio in un esercizo dello scritto io ho
c.f( 3 + 3.0 ): ma ho +f(double x): int NON in C, e neanche in B ma si trova in A posso restituire come risultato f(double x) in A? è corretto?

zack1988
Da quello che ho capito tu hai un metodo in A che è f(double x) e vuoi che sia ereditato in C allora visto che A <- B <- C quindi puoi farlo:

Sempre usando java:
PHP:

public class {
  public 
void f(double x) {
    
System.out.println(x);
  }
}

public class 
extends {}

public class 
extends {}

public class 
Test {
  public static 
void main(String [] args) {
    
C istanzaC = new C();
    
istanzaC.f(10);
  }
}


Paul442
nel compito del 21-01-2010 l'UML era cosi strutturato:
A
+f(long x): int

B
+f(int x): int
+f(double x): int

A a;
B b;
C c;
D d;

a = new B();
b = new B();
c = new D();
d = new D();

Non capisco perchè
• a.f( 3.0 ): ha come soluzione ERRORE! in teoria essendo che a = new B(); non dovrebbe prendere F(double x) in B?

zack1988
potresti passarmi il testo del compito.

CASO 1:
A <- B (B estende A)
L'eredita è a senso "unico" il figlio prende le propietà dal padre e non il contrario.

Quindi in questo caso quando hai istanziato a : A a = new B();
facendo a.f(double) va in errore perchè la classe A non ha visibilità dei metodi e delle propietà di B, quindi non trovando il metodo f con parametro double.

Per poter accedere al metodo devi eseguire il casting:
B b = (B) a;

CASO 2:
B <- A (A estende B)
allora andava in errore quando tentavi di inizializzare
a = new B();

Paul442
Grazie mille!

Paul442
scusa ma rileggendo tutto l'esercizio (che ora ti allego qua in pdf) forse nn mi è ancora del tutto chiaro...non dovrebbe essere la stessa cosa anche per
• c.f( 3 + "ciao".length() ): ?
xke qua invece va bene?
Grazie

zack1988
3.0 è un double invece 3 + 4 (lunghezza di "ciao") è intero.
in A hai il metodo f(long x)

Eccoti un link per i tipi di dati primitivi in java :
http://download.oracle.com/javase/t.../datatypes.html

Paul442
grazie mille per il link...

tyrdrummer
Originally posted by zack1988
potresti passarmi il testo del compito.

CASO 1:
A <- B (B estende A)
L'eredita è a senso "unico" il figlio prende le propietà dal padre e non il contrario.

Quindi in questo caso quando hai istanziato a : A a = new B();
facendo a.f(double) va in errore perchè la classe A non ha visibilità dei metodi e delle propietà di B, quindi non trovando il metodo f con parametro double.

Per poter accedere al metodo devi eseguire il casting:
B b = (B) a;

CASO 2:
B <- A (A estende B)
allora andava in errore quando tentavi di inizializzare
a = new B();


sinceramente non capisco perchè dici che l'ereditarietà è a senso unico, nel caso
a.f(double) c'è un metodo double nella classe B pronto perchè mi parli di classe A? Il compilatore vedendo il tipo dell'oggetto ovvero di tipo B non dovrebbe selezionare i metodi di B e quindi il relativo metodo double?

tyrdrummer
tutto ok ho capito

:)

Powered by: vbHome (lite) v4.1 and vBulletin v2.3.1 - Copyright ©2000 - 2002, Jelsoft Enterprises Limited
Mantained by dsy crew (email) | Collabora con noi | Segnalaci un bug | Archive | Regolamento |Licenze | Thanks | Syndacate