Oggetti C# e Obj-C

di il
7 risposte

Oggetti C# e Obj-C

Mi piacerebbe programmare per Apple e probabilmente seguirò il consiglio di Toki di usare monotouch. Comunque ho guardato un poco Obj-C e sono rimasto stupito per la sintassi usata per gli oggetti.
Volevo chiedere sono solo differenze di sintassi o vi sono differenze più profonde?

7 Risposte

  • Re: Oggetti C# e Obj-C

    Ciao Orso Bruno,
    non sono tanto esperto da darti delle risposte precise, comunque qualcosa te lo posso dire.
    Una differenza ta i due linguaggi è che il C# (e il C++) sono linguaggi fortemente tipizzati, mentre l' Objective-C no, è debolmente tipizzato (weakly-typed).

    Questo significa che molte delle operazioni di collegamento ai metodi vengono fatte a run-time. Ad esempio in Objective-C puoi inviare un messaggio ad un oggetto anche se questo messaggio non è previsto dal suo tipo. In C# riceveresti un errore di compilazione.

    Un' altra cosa che mi ha colpito è che puoi mandare messaggi ad aggetti che sono a nil (in C# null) senza particolari problemi.
  • Re: Oggetti C# e Obj-C

    Quando dici inviare un messaggio intendi dire richiamare un metodo? Mi puoi fare un esempio di quello che hai detto?
  • Re: Oggetti C# e Obj-C

    Ciao Orso Bruno,
    si, inviare un messaggio è sinonimo di richiamare un metodo, dopo un pò ci si abitua e sembra quasi meglio.

    Ecco un esempio sulla tipizzazione debole, ho scritto queste due classi:
    
    // Dog.h
    @interface Dog : NSObject
    - (void) Write;
    @end
    
    // Dog.m
    - (void) Write
    {
        NSLog(@"Bau");
    }
    
    // Car.h
    @interface Car : NSObject
    - (void) Write;
    @end
    
    // Car.m
    - (void) Write
    {
        NSLog(@"Brum");
    }
    
    In pratica 'Dog' scrive 'Bau' e 'Car' scrive 'Brum'. Nota che le due classi non sono imparentate e che non si usa nessun 'virtual' o 'override', sono semplicemente due classi che non c' entrano nulla l' una con l' altra, hanno solo un metodo con lo stesso nome.

    Se ora dichiaro una variabile di tipo 'id' (corrisponde a un void* del C++ o a un 'object' del C#) puoi scrivere:
    
       id p = [Dog new];
       [p Write];
        
       p = [Car new];
       [p Write];
    
    Ottenendo come output 'Bau' e Brum'. Una cosa del genere in C# non sarebbe fattibile, avresti degli errori di compilazione per via dei controlli sui tipi. Invece in objective-C il collegamento tra l' oggetto e i suoi metodi viene demandato a run-time.

    Ancora più divertente se scrivi:
    
       Dog* p = [Dog new];
       [p Write];
        
       p = [Car new];
       [p Write];
    
    Otterrai una warning sull' assegnamento di un 'Car' a un 'Dog' ma nulla più, poi funziona come prima!

    In effetti in un ambiente del genere usare il termine 'inviare un messaggio' è meglio che 'richiamare' un metodo', fà pensare ad un legame meno stretto. In fondo un messaggio lo puoi mandare a chi ti pare
  • Re: Oggetti C# e Obj-C

    E per quanto riguarda ereditarietà e polimorfismo come funziona?
  • Re: Oggetti C# e Obj-C

    L' ereditarietà funziona come per il C#, e non c' è l' ereditarietà multipla. Il polimorfismo puoi pensarlo anche lui come quello del C# però sfrutta il fatto che è un linguaggio dinamico, quindi non si usano VMT o robe simili ma il collegamento con i metodi avviene a run time. Riguardo a questo prova a riguardare l' esempio che ho fatto prima con le classi Dog e Car.
  • Re: Oggetti C# e Obj-C

    Ciao ragazzi
    Sono affascinato e inorridito allo strsso tempo, ma che razza di linguaggio é!? Mi fate qualche altro esempio?
  • Re: Oggetti C# e Obj-C

    Giove Pluvio ha scritto:


    Ciao ragazzi
    Sono affascinato e inorridito allo strsso tempo, ma che razza di linguaggio é!? Mi fate qualche altro esempio?
    Ehhh, ma quanto brontolate con questo Objective-C! Adesso apro un tread in cui discutiamo di come è fatta una classe.
Devi accedere o registrarti per scrivere nel forum
7 risposte