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 A {
public void metodoA() {
System.out.println("METEODO A");
}
}
public class B extends A {
public void metodoB() {
System.out.println("METODO B");
}
}
public class C extends B {
public void metodoC() {
System.out.println("METODO C");
}
}
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 A {
public void f(double x) {
System.out.println(x);
}
}
public class B extends A {}
public class C extends B {}
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 |
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 |
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
:) |
|
|
|