Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria
Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria
vivo X300 Pro rappresenta un'evoluzione misurata della serie fotografica del produttore cinese, con un sistema di fotocamere migliorato, chipset Dimensity 9500 di ultima generazione e l'arrivo dell'interfaccia OriginOS 6 anche sui modelli internazionali. La scelta di limitare la batteria a 5.440mAh nel mercato europeo, rispetto ai 6.510mAh disponibili altrove, fa storcere un po' il naso
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo
Lenovo Legion Go 2 è la nuova handheld PC gaming con processore AMD Ryzen Z2 Extreme (8 core Zen 5/5c, GPU RDNA 3.5 16 CU) e schermo OLED 8,8" 1920x1200 144Hz. È dotata anche di controller rimovibili TrueStrike con joystick Hall effect e una batteria da 74Wh. Rispetto al dispositivo che l'ha preceduta, migliora ergonomia e prestazioni a basse risoluzioni, ma pesa 920g e costa 1.299€ nella configurazione con 32GB RAM/1TB SSD e Z2 Extreme
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti
A re:Invent 2025, AWS mostra un’evoluzione profonda della propria strategia: l’IA diventa una piattaforma di servizi sempre più pronta all’uso, con agenti e modelli preconfigurati che accelerano lo sviluppo, mentre il cloud resta la base imprescindibile per governare dati, complessità e lock-in in uno scenario sempre più orientato all’hybrid cloud
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 12-02-2008, 16: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 17:29.
astorcas è offline   Rispondi citando il messaggio o parte di esso
Old 12-02-2008, 20: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, 02: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, 08: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, 09: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, 10:05   #6
k0nt3
Senior Member
 
Iscritto dal: Dec 2005
Messaggi: 7260
@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, 10: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 10:53.
fek è offline   Rispondi citando il messaggio o parte di esso
Old 13-02-2008, 10: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, 11: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, 13: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, 14: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, 14:36   #12
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2782
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, 14: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, 15:05   #14
k0nt3
Senior Member
 
Iscritto dal: Dec 2005
Messaggi: 7260
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, 15: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 14-02-2008, 00: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 14-02-2008, 00: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, 08: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, 08: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, 10: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


Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria Recensione vivo X300 Pro: è ancora lui il...
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'...
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti AWS re:Invent 2025: inizia l'era dell'AI-as-a-Se...
Cos'è la bolla dell'IA e perché se ne parla Cos'è la bolla dell'IA e perché se...
BOOX Palma 2 Pro in prova: l'e-reader diventa a colori, e davvero tascabile BOOX Palma 2 Pro in prova: l'e-reader diventa a ...
Il nucleo della cometa interstellare 3I/...
La Russia potrebbe sviluppare un'arma pe...
Manda la RAM Corsair in assistenza, rice...
ASUS ROG G1000 con 'AniMe Holo': saranno...
Un test di longevità ha messo alla prova...
Incat inizia i test dell'incredibile tra...
LG Sound Suite: al CES il sistema audio ...
Avengers Doomsday, il primo trailer &egr...
La crisi delle memorie non farà sconti a...
Il trailer più atteso dell'anno &...
I gamer vogliono i monitor OLED: sopratt...
Samsung alza l’asticella dei televisori ...
Energie rinnovabili 2025: quasi 42% del ...
Le auto elettriche volano in tutta Europ...
Nuovo look per la finestra Esegui su Win...
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: 23:02.


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