Newsgroup: it.comp.java
Titolo: Unione

Scusate la domanda stupida, ma come si implementa in Java la classe C
unione della classe A e B?
Grazie,
Eva

 unione della classe A e B?
Non capisco cosa intendi per "unione". 
Puoi spiegarti meglio?
Ciao,
   Marina



Ah, si, scusa. Intendo una classe le cui istanze possono essere istanze di
A o di B.
Ho una classe A = 'stringhe di "a" e "b"' 
              B = 'stringhe di numeri"
voglio C= A + B
Ciao.
Eva

 voglio C= A + B
Se ho capito bene, tu vuoi una classe che implementi due interfacce,
l'interfaccia A e l'interfaccia B.
Quindi devi dichiarare A come Interface, B pure, definire i loro
metodi, e C implementera' A e B, e dovra' quindi implementarne tutti
i metodi di A e tutti quelli di B.
Cosi' una variabile di tipo C e' anche di tipo A e di tipo B.
Non si puo' fare con "extends", cioe' C non puo' essere una sottoclasse
sia di A che di B, perche' in Java l'ereditarieta' multipla non e'
ammessa.
Spero che sia questo quello che tu chiedevi, altrimenti vuol dire che 
non ho capito la tua domanda! :-)
Ciao,
  Marina

unione della classe A e B?
Immagino che tu intenda una classe che "extends" sia A, sia B.
Java non supporta pero` l'eredita` multipla (di implementazione,
cioe` con "extends"; nessun problema su quella di interfaccia,
cioe` con "implements").
Di conseguenza, bisognera` che:
-- almeno una delle classi (meglio per simmetria tutte e due,
    ma per semplicita` diciamo ad esempio B) implementi una
    opportuna interfaccia (o piu` interfaccie che tutte insieme
    la definiscono, ma diciamo per semplicita` una, ad es IB)
-- tutto il codice-cliente che "usa B" in realta` usi IB
    class C extends A implements IB {
        B  super_B;
        // delegare a super_B tutti i metodi di IB che
        // non vogliamo rifare nella C
        // altre cose tipiche della sola C
    }
In alternativa C puo` avere una inner class che "extends B",
pero` in questo caso non si puo` semplicemente passare un
riferimento a C a del codice-cliente che si aspetta un riferimento
a B, occorre invece chiamare un metodo del C che restituisca
il riferimento a detta inner class.
La programmazione totalmente basata su interfacce offre
praticamente solo vantaggi, e TANTI vantaggi.  Una buona
fetta dell'eccellente testo "Design Patterns" di Gamma,
Vlissides, et al, e` dedicata ai vari schemi ("factories", ecc)
che permettono di approssimarsi a questo ideale.  Purtroppo,
in Java come in ogni altro linguaggio OO di mia conoscenza,
usare "implements + delegazione", invece di "extends",
richiede la scrittura di parecchio codice (semplicissimo,
ripetitivo, meccanico) che "passa la palla" per tutti i metodi
che si vogliono appunto "delegare"; e` un pezzo che sogno
un costrutto del tipo
    "forward [ev. sottospecifiche] to [espressione]"
per risparmiare tutto questo "boilerplate".
Alex

 Cosi' una variabile di tipo C e' anche di tipo A e di tipo B.
No, no, io volevo fare la Union di due CLASSI che ho gia'. 
Ad esempio Person e Animal.
Senza doverne riscrivere tutti i metodi e potendo applicare ad ogni
istanza di A (B) i metodi della classe A (B), ovviamente.
Cercavo qualcosa che somigliasse alla union del C++.
Grazie comunque.

Cercavo qualcosa che somigliasse alla union del C++.
Allora Java ti andra` bene: infatti, anche in C++ non
puoi fare la union di vere e proprie classi (solo di "plain
old data" -- int, char, double, ecc)...:-).
Fuori di scherzo, ecco uno schema di soluzione:
    interface union_A_B {
        A asA();
        B asB();
    };
    class united_A extends A implements union_A_B {
        public A asA() { return this; }
        public B asB() { return null; }
    };
    class united_B extends B implements union_A_B {
        public A asA() { return null; }
        public B asB() { return this; }
    };
Rispetto a una vera union, questo ha il piccolo extra di
"sapere" se e` una A o una B in un qualsiasi dato
momento (e quindi naturalmente un piccolo overhead,
anche se questo overhead non e` immediatamente
chiaro; comunque, purtroppo, fidati, c'e`:-)
Alex