• I protocolli in Objective C sono molto simili alle interfacce di Java

    Date: 2011.11.15 | Category: Objective C | Tags:

    Nel linguaggio Objective C sono presenti i protocolli. In parole povere un protocollo è la stessa cosa di quello che in Java ed altri linguaggi come ad esempio Actionscript si chiama interfaccia.

    Vediamo in termini più formali una definizione di protocollo: è un insieme di metodi che vengono dichiarati come entità a se stanti e che vengono usati dalle classi per prendersi degli impegni su come devono comportarsi.

    i protocolli in objective c

    Come si dichiara un protocollo

    Si dichiara all’interno della coppia @protocol / @end.

    Come nel caso delle interfacce, all’interno di un protocollo sono presenti esclusivamente le signatures dei metodi.

    La classe che adotta un protocollo si prenderà l’impegno di attribuire un corpo ai metodi specificati nel protocollo.

    Se una classe adotta un determinato protocollo, anche le sue sottoclassi automaticamente lo adotteranno.

    Perché si usano i protocolli?

    Perché adottando un protocollo una classe informa i propri utilizzatori del fatto che è capace di rispondere ad un’insieme di metodi senza porre dei limiti sull’ereditarietà.

    Differenza rispetto a Java /AS

    C’è una sottile ma importante differenza. Se in Java/AS dichiariamo che una certa classe implementa un’interfaccia e poi ci dimentichiamo di mettere il codice per un metodo, il compilatore si blocca e non genera l’eseguibile. Mentre in Objective C il compilatore ci da un warning, quindi produce ugualmente un eseguibile. Se in fase di runtime chiamiamo il metodo che manca, l’applicazione inevitabilmente si bloccherà.

    Questo impone una maggior attenzione da parte del programmatore ai messaggi di warning restituiti dal compilatore.

    Esempio

    @protocol Print
    - (void) print
    @end

    @interface MyClass : NSObject <Print>
    {
    ...
    }

    @implementation MyClass
    - (void) print { .... }
    @end

    Nell’esempio abbiamo definito un protocollo di nome Print che contiene la signature di un metodo print.
    Nella parte dichiarativa di una classe (@interface) oltre a definire il nome della classe (MyClass) e la classe da cui MyClass eredita (NSObject), tra parentesi angolari indichiamo che MyClass adotta il protocollo Print.

    Attenzione che in altri linguaggi come ad esempio Java le parentesi angolari hanno un altro significato: in genere indicano l’uso di programmazione generica, qui invece significa che la classe adotta un determinato protocollo.

    Implementare più protocolli

    Una classe può implementare più protocolli:

    @interface NSData:NSObject <NSCopying, NSMutableCopying> {
    ....
    }
    @end

    Quando dichiariamo una variabile o creiamo un metodo possiamo dire che quella variabile implementa un protocollo:

    - (void) draggingEnded: (id <NSDraggingInfo> ) sender;

    Questo ci permette in fase di compilazione di controllare se il parametro che sto passando è conforme al protocollo indicato.

    Protocolli con metodo opzionali

    E’ possibile utilizzare la keyword @optional per indicare che alcuni metodi specificati nel protocollo sono opzionali. Esiste anche la keyword @required per marcare il fatto che l’implementazione di un metodo è obbligatoria.

    @protocol MyProtocol
    -(void) requiredMethod;
    @optional
    - (void) anOptionalMethod;
    @end

    La presenza di metodi opzionali solleva un potenziale problema nel momento in cui si opera su un oggetto che dovrebbe essere conforme ad un dato protocollo e noi vogliamo utilizzare un metodo opzionale.
    In questo caso non siamo sicuri che quel determinato oggetto lo implementi o meno. Bisogna verificare se quel metodo è implementato richiamando il metodo RespondsToSelector

    id <MyProtocol> o;

    if([o respondsToSelector: @selector (anOptionalMethod)]){

    }

    Approfondimenti

    Ecco tre brevi e semplici videocorsi sviluppati dai ragazzi di iMakeApps (http://www.imakeapps.it/video-corsi/ )

    I Protocolli in Objective C – Parte 1

    blah

    I Protocolli in Objective C – Parte 2

    blah

    I Protocolli in Objective C – Parte 3

    blah