Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Un fulmine sulla scrivania, Corsair Sabre v2 Pro ridefinisce la velocità nel gaming
Un fulmine sulla scrivania, Corsair Sabre v2 Pro ridefinisce la velocità nel gaming
Questo mouse ultraleggero, con soli 36 grammi di peso, è stato concepito per offrire un'esperienza di gioco di alto livello ai professionisti degli FPS, grazie al polling rate a 8.000 Hz e a un sensore ottico da 33.000 DPI. La recensione esplora ogni dettaglio di questo dispositivo di gioco, dalla sua agilità estrema alle specifiche tecniche che lo pongono un passo avanti
Nokia Innovation Day 2025: l’Europa ha bisogno di campioni nelle telecomunicazioni
Nokia Innovation Day 2025: l’Europa ha bisogno di campioni nelle telecomunicazioni
Dal richiamo di Enrico Letta alla necessità di completare il mercato unico entro il 2028 alla visione di Nokia sul ruolo dell’IA e delle reti intelligenti, il Nokia Innovation Day 2025 ha intrecciato geopolitica e tecnologia, mostrando a Vimercate come la ricerca italiana contribuisca alle sfide globali delle telecomunicazioni
Sottile, leggero e dall'autonomia WOW: OPPO Reno14 F conquista con stile e sostanza
Sottile, leggero e dall'autonomia WOW: OPPO Reno14 F conquista con stile e sostanza
OPPO Reno14 F 5G si propone come smartphone di fascia media con caratteristiche equilibrate. Il device monta processore Qualcomm Snapdragon 6 Gen 1, display AMOLED da 6,57 pollici a 120Hz, tripla fotocamera posteriore con sensore principale da 50MP e generosa batteria da 6000mAh con ricarica rapida a 45W. Si posiziona come alternativa accessibile nella gamma Reno14, proponendo un design curato e tutto quello che serve per un uso senza troppe preoccupazioni.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 12-02-2008, 15:31   #1
astorcas
Senior Member
 
L'Avatar di astorcas
 
Iscritto dal: Jan 2005
Città: Siena
Messaggi: 1313
[OOP] Ereditarietà multipla solo tramite interfacce... preché?

Ciao a tutti,
credo che sia noto a tutti che linguaggi come Java e C# non consentono l'ereditarietà multipla (tramite classi).... ma perchè?
Capisco che potrebbe venir fuori un bel casino con i nomi delle variabili e metodi che potrebbero essere troppo simili (se non uguali) fra una classe madre e l'altra.... ma c'è altro?
Qualcuno potrebbe fornirmi un link o indicarmi qualche libro da leggere che potrebbe chiarirmi le idee?
O magari avete qualche esempio lampante?

Thanks!

Ultima modifica di astorcas : 12-02-2008 alle 16:29.
astorcas è offline   Rispondi citando il messaggio o parte di esso
Old 12-02-2008, 19:35   #2
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
Il problema si chiama "Diamond Problem", ed e' parente del dubbio da te sollevato.
Immagina una classe A, padre di tutti, con il metodo virtuale Pippo();
B e C sono due altre classi figlie di A, ed entrambe implementano il metodo Pippo(), ma in modo diverso.
Se poi D deriva da entrambe le classi B e C, essa e' ovviamente anche di tipo A, e pertanto avra' anch'essa il metodo Pippo.
Ma se non effettua l'override di Pippo, qualora un'istanza di tale classe chiamasse il metodo, quale versione verrebbe eseguita?

Se cerchi in giro lo trovi.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto.
E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 13-02-2008, 01:24   #3
astorcas
Senior Member
 
L'Avatar di astorcas
 
Iscritto dal: Jan 2005
Città: Siena
Messaggi: 1313
Quote:
Originariamente inviato da gugoXX Guarda i messaggi
Il problema si chiama "Diamond Problem", ed e' parente del dubbio da te sollevato.
Immagina una classe A, padre di tutti, con il metodo virtuale Pippo();
B e C sono due altre classi figlie di A, ed entrambe implementano il metodo Pippo(), ma in modo diverso.
Se poi D deriva da entrambe le classi B e C, essa e' ovviamente anche di tipo A, e pertanto avra' anch'essa il metodo Pippo.
Ma se non effettua l'override di Pippo, qualora un'istanza di tale classe chiamasse il metodo, quale versione verrebbe eseguita?

Se cerchi in giro lo trovi.
Grazie! In effetti anche per il compilatore non deve essere un lavoro piacevole....
astorcas è offline   Rispondi citando il messaggio o parte di esso
Old 13-02-2008, 07:24   #4
cdimauro
Senior Member
 
L'Avatar di cdimauro
 
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
Infatti in caso di "conflitto" dev'essere il programmatore a "sbrogliare la matassa", indicando quale dei due metodi dev'essere chiamato.

Comunque i "conflitti" dovuti a metodi con lo stesso nome possono verificarsi anche con le interfacce.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro
@LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro
Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys
cdimauro è offline   Rispondi citando il messaggio o parte di esso
Old 13-02-2008, 08:24   #5
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
Quote:
Originariamente inviato da cdimauro Guarda i messaggi
Infatti in caso di "conflitto" dev'essere il programmatore a "sbrogliare la matassa", indicando quale dei due metodi dev'essere chiamato.
In questi casi ammettendo ambiguita' che si possono risolvere solo venendo meno ad alcune semantiche per le quali il modello ad oggetti e' largamente diffuso, secondo me significa che il modello ad oggetti e' piu' debole.
Ci si puo' convivere, ma forzando il programmatore a specificare quale funzione usare tra quelle a disposizione e'un po' come avere delle funzioni esterne alla classe.

Quote:
Comunque i "conflitti" dovuti a metodi con lo stesso nome possono verificarsi anche con le interfacce.
Questo invece non e' vero, almeno in C#.
Le interfaccie sono solo dei contratti tra compilatore e programmatore, senza codice.
Aggiungendo una interfaccia ad una classe solo si costringe tale classe ad avere implementati alcuni metodi particolari, e si potra' fare successivamente affidamento sull'esistenza di tali metodi.
Se per un motivo o per l'altro l'implementazione del metodo dell'interfaccia la tua classe gia' ce l'ha (nel nostro caso appunto perche' l'ha erediata) tanto di meglio.
Ma non si hanno conflitti.

Codice:
 class padre
    {
        public int pippo = 0;

            public virtual int MetodoCritico(int variabile)
            {
                return 0;
            }
    }

    interface HabemusCriticum
    {
        int MetodoCritico(int variabile);
    }

    class NonCentraNulla:HabemusCriticum
    {
        public int robadinoncentranulla=-1;

        #region HabemusCriticum Members

        public int MetodoCritico(int variabile)
        {
            throw new Exception("The method or operation is not implemented.");
        }

        #endregion
    }

    class figlio:padre,HabemusCriticum
    {
        public int altro = -1;
        public int AltroAncora(float ciccio)
        {
            return 0;
        }
    }
Questo codice compila, e la classe figlio ha una sola implementazione di MetodoCritico, pur essendo contemporaneamente sia derivata da padre e sia implementando l'interfaccia HabemusCriticum.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto.
E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 13-02-2008, 09:05   #6
k0nt3
Senior Member
 
Iscritto dal: Dec 2005
Messaggi: 7251
@gugoXX
e se due interfaccie hanno un metodo con lo stesso nome, stessi parametri, ma tipi di ritorno diversi?
mi sa che il compilatore si offende in ogni caso, ma dovrei provare. in java bisogna stare attenti anche con la dichiarazione delle eccezioni.
questo non toglie IMHO che ereditarietà singola + interfacce porta nella maggiorparte dei casi a soluzioni più eleganti e più semplici da comprendere. poi anche il compilatore può togliersi questo peso
k0nt3 è offline   Rispondi citando il messaggio o parte di esso
Old 13-02-2008, 09:51   #7
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
Quote:
Originariamente inviato da cdimauro Guarda i messaggi
Infatti in caso di "conflitto" dev'essere il programmatore a "sbrogliare la matassa", indicando quale dei due metodi dev'essere chiamato.

Comunque i "conflitti" dovuti a metodi con lo stesso nome possono verificarsi anche con le interfacce.
No Cesare perche' c'e' sempre e solo una implementazione eseguibile che viene "esposta" al mondo attraverso due o piu' interfacce, ma il metodo da invocare non e' ambiguo.

PS. Ragassuoli, interfacce senza la i

Ultima modifica di fek : 13-02-2008 alle 09:53.
fek è offline   Rispondi citando il messaggio o parte di esso
Old 13-02-2008, 09:55   #8
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
Quote:
Originariamente inviato da k0nt3 Guarda i messaggi
questo non toglie IMHO che ereditarietà singola + interfacce porta nella maggiorparte dei casi a soluzioni più eleganti e più semplici da comprendere. poi anche il compilatore può togliersi questo peso
Esistono situazioni come il virtual multiple dispatch, quando il dispach non e' solo sull'oggetto ma anche sugli argomenti del metodo, che possono essere risolti in maniera piu' semplice e elegante attraverso l'ereditarieta' multipla. Per fortuna sono rari e non me ne e' praticamente mai capitato uno per strada.
fek è offline   Rispondi citando il messaggio o parte di esso
Old 13-02-2008, 10:42   #9
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
Se hai tempo potresti buttare giu' un paio di esempi?
Stavo cercando appunto un caso in cui l'eredita' multipla potesse avere vantaggi rispetto alle interfacce (senza la i), ma non me ne e' venuto in mente neppure uno che non riuscissi a risolvere comunque elegantemente con un buon disegno ad interfacce.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto.
E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 13-02-2008, 12:57   #10
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
Quote:
Originariamente inviato da gugoXX Guarda i messaggi
Se hai tempo potresti buttare giu' un paio di esempi?
Stavo cercando appunto un caso in cui l'eredita' multipla potesse avere vantaggi rispetto alle interfacce (senza la i), ma non me ne e' venuto in mente neppure uno che non riuscissi a risolvere comunque elegantemente con un buon disegno ad interfacce.
Il tempo e' l'unica cosa che non ho mai. No anche i soldi.
A parte gli scherzi, si', cerco di buttare giu' un esempio ma mi devo ristudiare il problema prima, perche' l'ultima mi si e' arrotolato il cervello e non e' un design che si usa spesso.

Ricordamelo pero'.
fek è offline   Rispondi citando il messaggio o parte di esso
Old 13-02-2008, 13:22   #11
VICIUS
Senior Member
 
L'Avatar di VICIUS
 
Iscritto dal: Oct 2001
Messaggi: 11471
Quote:
Originariamente inviato da k0nt3 Guarda i messaggi
@gugoXX
e se due interfaccie hanno un metodo con lo stesso nome, stessi parametri, ma tipi di ritorno diversi?
Se intendi due funzioni con stessa signature ma con tipo di ritorno diverso in c# non è possibile farlo quindi il problema non si pone. Per essere più chiaro questo esempio non è c# valido.
Codice:
    public class MediaAritmetica
    {
        public double media(int x, int y)
        {
            ;
        }
        
        public float media(int x, int y)
        {
            ;
        }
    }
VICIUS è offline   Rispondi citando il messaggio o parte di esso
Old 13-02-2008, 13:36   #12
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2774
Credo che lui intendesse due interfacce distinte con ognuna un metodo con stesso nome e parametri ma tipo di ritorno diverso e poi una terza classe che le eredita
wingman87 è offline   Rispondi citando il messaggio o parte di esso
Old 13-02-2008, 13:43   #13
VICIUS
Senior Member
 
L'Avatar di VICIUS
 
Iscritto dal: Oct 2001
Messaggi: 11471
Quote:
Originariamente inviato da wingman87 Guarda i messaggi
Credo che lui intendesse due interfacce distinte con ognuna un metodo con stesso nome e parametri ma tipo di ritorno diverso e poi una terza classe che le eredita
Dovrebbe comunque implementare i metodi dell'interfaccia nella stessa classe e arriverebbe a quella situazione. Io la prima volta che ci sono cascato o pensato bene di usare una partial class ma il compilatore non è stato così tonto da cascarci
VICIUS è offline   Rispondi citando il messaggio o parte di esso
Old 13-02-2008, 14:05   #14
k0nt3
Senior Member
 
Iscritto dal: Dec 2005
Messaggi: 7251
Quote:
Originariamente inviato da VICIUS Guarda i messaggi
Dovrebbe comunque implementare i metodi dell'interfaccia nella stessa classe e arriverebbe a quella situazione. Io la prima volta che ci sono cascato o pensato bene di usare una partial class ma il compilatore non è stato così tonto da cascarci
infatti supponevo che il compilatore si sarebbe offeso il mio era un discorso più teorico che pratico
k0nt3 è offline   Rispondi citando il messaggio o parte di esso
Old 13-02-2008, 14:34   #15
astorcas
Senior Member
 
L'Avatar di astorcas
 
Iscritto dal: Jan 2005
Città: Siena
Messaggi: 1313
Caspita mi avete illuminato!

Ma allora in caso di ereditarietà multipla (vedi C++) che cavolo fa il compilatore se una classe estende 2 classi aventi stesso metodo con comportamento completamente diverso? Bisogna specificare esplicitamente quale dei due utilizzare, si ha errore in compilazione o cos'altro? In effetti potrei provare da me....
astorcas è offline   Rispondi citando il messaggio o parte di esso
Old 13-02-2008, 23:49   #16
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
Quote:
Originariamente inviato da gugoXX Guarda i messaggi
Se hai tempo potresti buttare giu' un paio di esempi?
Stavo cercando appunto un caso in cui l'eredita' multipla potesse avere vantaggi rispetto alle interfacce (senza la i), ma non me ne e' venuto in mente neppure uno che non riuscissi a risolvere comunque elegantemente con un buon disegno ad interfacce.
Un esempio che mi viene in mente e' quando hai da interfacciare delle classi con middleware tipo CORBA o ICE. In quel caso alle interfacce CORBA (/ICE) corrisponde non una interfaccia pure, ma una classe con del codice per il marshalling e per la gestione dell'oggetto stesso.
Supponi di avere la seguente situazione
Codice:
             Robot
             /    \
            /      \
           /        \
  FlyingRobot    GenericRobot
             \      /       \
               R2D2           HK-47
dove Robot e FlyingRobot sono le due classi che rappresentano l'interfaccia col mondo esterno, mentre in GenericRobot fattorizzi del codice comune a tutte le sottoclassi di Robot... in questo caso vuoi avere la possibilita' della ereditarieta' multipla visto che da un lato non vuoi ripetere il codice in tutte le sottoclassi, e dall'altro FlyingRobot e' una classe con solo una parte dei metodi astratti, e sulla quale hai poco margine di manovra.
A me questo sembra un caso in cui tutte le alternative sembrano meno semplici e pulite.
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele
marco.r è offline   Rispondi citando il messaggio o parte di esso
Old 13-02-2008, 23:55   #17
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
Quote:
Originariamente inviato da fek Guarda i messaggi
Esistono situazioni come il virtual multiple dispatch, quando il dispach non e' solo sull'oggetto ma anche sugli argomenti del metodo, che possono essere risolti in maniera piu' semplice e elegante attraverso l'ereditarieta' multipla. Per fortuna sono rari e non me ne e' praticamente mai capitato uno per strada.
Il multiple dispatch torna comodo in quei contesti in cui devi implementare in modo elegante operatori binari tra tipi diversi che fanno parte di una stessa famiglia, ad esempio la somma tra un razionale e un immaginario, senza dover implementare quintali di operatori di conversione, magari da dover chiamare esplicitamente.
Per inciso qualcuno conosce qualche linguaggio che supporti il multiple dispatch in modo "naturale", oltre a CLOS ?
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele
marco.r è offline   Rispondi citando il messaggio o parte di esso
Old 14-02-2008, 07:33   #18
cdimauro
Senior Member
 
L'Avatar di cdimauro
 
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
Quote:
Originariamente inviato da fek Guarda i messaggi
No Cesare perche' c'e' sempre e solo una implementazione eseguibile che viene "esposta" al mondo attraverso due o piu' interfacce, ma il metodo da invocare non e' ambiguo.
Io mi riferivo a questo:
Quote:
Originariamente inviato da wingman87 Guarda i messaggi
Credo che lui intendesse due interfacce distinte con ognuna un metodo con stesso nome e parametri ma tipo di ritorno diverso e poi una terza classe che le eredita
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro
@LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro
Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys
cdimauro è offline   Rispondi citando il messaggio o parte di esso
Old 14-02-2008, 07:36   #19
cdimauro
Senior Member
 
L'Avatar di cdimauro
 
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
Quote:
Originariamente inviato da marco.r Guarda i messaggi
Un esempio che mi viene in mente e' quando hai da interfacciare delle classi con middleware tipo CORBA o ICE. In quel caso alle interfacce CORBA (/ICE) corrisponde non una interfaccia pure, ma una classe con del codice per il marshalling e per la gestione dell'oggetto stesso.
OT Sei il primo qui che vedo che conosce ICE.

Se non sono indiscreto, posso chiederti per cosa lo usate?
Quote:
Supponi di avere la seguente situazione
Codice:
             Robot
             /    \
            /      \
           /        \
  FlyingRobot    GenericRobot
             \      /       \
               R2D2           HK-47
R2D2 Il forum ormai ha preso una "brutta" piega...
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro
@LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro
Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys
cdimauro è offline   Rispondi citando il messaggio o parte di esso
Old 14-02-2008, 09:41   #20
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
Quote:
Originariamente inviato da cdimauro Guarda i messaggi
Io mi riferivo a questo:

Se hanno tipo di ritorno diverso sono due metodi diversi e sono illegali quindi il problema non si pone
(Non in C++ se i due tipi di ritorno sono compatibili)
fek è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Un fulmine sulla scrivania, Corsair Sabre v2 Pro ridefinisce la velocità nel gaming Un fulmine sulla scrivania, Corsair Sabre v2 Pro...
Nokia Innovation Day 2025: l’Europa ha bisogno di campioni nelle telecomunicazioni Nokia Innovation Day 2025: l’Europa ha bisogno d...
Sottile, leggero e dall'autonomia WOW: OPPO Reno14 F conquista con stile e sostanza Sottile, leggero e dall'autonomia WOW: OPPO Reno...
Destiny Rising: quando un gioco mobile supera il gioco originale Destiny Rising: quando un gioco mobile supera il...
Plaud Note Pro convince per qualità e integrazione, ma l’abbonamento resta un ostacolo Plaud Note Pro convince per qualità e int...
ASUS sperimenta GPU senza connettori di ...
La Cina conquisterà lo spazio ent...
Samsung ha un nuovo entry level: debutta...
Caos nei cieli europei: attacco informat...
Volkswagen ferma la produzione di ID.Buz...
Super sconti del weekend Amazon: 5 novit...
Dreame non si ferma più: tra le n...
Samsung Galaxy Buds3 FE a meno di 95€ su...
Praticamente regalate: 135€ per le Squie...
Si rinnovano i coupon nascosti di settem...
Amazon sconta i componenti: occasioni d'...
Vibe coding: esplode la domanda di esper...
Ring Intercom su Amazon: citofono smart ...
Addio regie complicate: un'AI gestir&agr...
Xbox, nuovo aumento dei prezzi negli Sta...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 16:03.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v