English site
  • Objective-C: Protokoli

    Objavio: Luka Gabric, 29. 03. 2010. u kategoriji iPhone development

    computer_programmingProtokoli se koriste za definiranje skupa metoda koje se koriste ili se mogu implementirati u bilo kojoj klasi.

    Ključnom riječi @protocol započinje deklariranje protokola. Kod definiranja protokola ne postoje vitičaste zagrade s varijablama jer ih protokoli ne mogu definirati.

    @protocol ImeProtokola
     
    //deklaracije metoda
     
    - (void) nekaMetoda;
     
    @end

    Metoda definirana u protokolu može biti označena kao obvezna ili kao izborna u implementaciji. Obvezne se metode označavaju ključnom riječi @required, a izborne se metode označavaju ključnom riječi @optional. Ako metoda nije posebno označena jednom od ove dvije ključne riječi, smatra se da je obvezna.

    @protocol MojProtokol
     
    - (void) ovaMetodaJeObvezna;
    - (void) ovaMetodaJeIstoObvezna;
     
    @optional
    - (void) ovaMetodaJeIzborna;
    - (void) ovaMetodaJeIstoIzborna;
     
    @required
    - (void) ovoJeObveznaMetoda;
     
    @end

    Protokol može implementirati drugi protokol. Ovaj oblik implementacije ima neke sličnosti s nasljeđivanjem kod klasa, ali bez hijerarhije koja postoji kod klasa. Protokol MojProtokol iz prethodnog primjera može biti definiran na sljedeći način:

    @protocol MojProtokol < NekiProtokol, DrugiProtokol >
     
    @end
     
    @protocol NekiProtokol
     
    - (void) ovaMetodaJeObvezna;
     
    @optional
    - (void) ovaMetodaJeIstoIzborna;
     
    @required
    - (void) ovoJeObveznaMetoda;
     
    @end
     
    @protocol DrugiProtokol
     
    - (void) ovaMetodaJeIstoObvezna;
     
    @optional
    - (void) ovaMetodaJeIzborna;
     
    @end

    Kao što je pokazano u gore navedenom primjeru, deklaracija metoda protokola može biti prazna. To se svojstvo može koristiti za grupiranje objekata koji zadovoljavaju određene kriterije aplikacije.

    Identitet klase koja implementira određeni protokol nije bitan. Bitno je jedino provjeriti implementira li neka klasa određeni protokol ili ne. Ako klasa implementira neki protokol, onda ona odgovara tom protokolu.

    - (BOOL) objektOdgovaraNekomProtokolu: (id) nekiObjekt
    {
       if ( [nekiObjekt conformsToProtocol: @protocol (NekiProtokol)] )
          return YES;
       else
          return NO;
    }

    Korištenje protokola u Objective-C programskom jeziku nije obvezno, ali je vrlo korisno.

    Protokoli se mogu primijeniti u različitim slučajevima, kao npr. za deklariranje metoda koje drugi trebaju implementirati. To je od posebnog značaja kod projekata koji se dijele između više programera od kojih se očekuje da implementiraju istu skupinu metoda, ali na različite načine.

    Primjer pokazuje protokol nazvan ProtokolKojiSviImplementiraju, a nalzi se u NekiProtokol.h datoteci.

    // NekiProtokol.h
     
    @protocol ProtokolKojiSviImplementiraju
     
    - (int) vratiA;
    - (int) vratiB;
     
    @optional
    - (void) ispisZbroja;
     
    @required
    - (int) zbroj;
     
    @end

    Protokol je implementiran unutar klase na sljedeći način:

    //NekaKlasa.h
     
    #import "NekiProtokol.h"
     
    @interface NekaKlasa : NSObject < ProtokolKojiSviImplementiraju >
    {
     
    //nema deklariranih varijabli
     
    }
     
    //nema deklariranih metoda
     
    @end

    Sama klasa nema deklariranih metoda, ali odgovara protokolu čije metode, barem one obvezne, implementira. Metoda ispisZbroja je izborna i ne mora se implementirati.

    Metode se mogu implementirati na sljedeći način:

    // NekaKlasa.m
     
    #import "NekaKlasa.h"
     
    @implementation NekaKlasa
     
    - (int) vratiA
    {
       return 5;
    }
     
    - (int) vratiB
    {
       return 8;
    }
     
    - (int) zbroj
    {
       return [self vratiA] + [self vratiB];
    }
     
    - (void) ispisZbroja
    {
       printf("%d", [self zbroj]);
    }
     
    @end

    Neka druga klasa koja odgovara istom protokolu ProtokolKojiSviImplementiraju može navedene metode implementirati na drugi način. Protokol se koristi za deklariranje metoda, a ne načina na koji će se te metode implementirati.

    Protokoli su korisni i za definiranje objekata čija je klasa sakrivena.

    id < NekiProtokol > nekiObjekt;

    Klasa ovog objekta u ovom trenutku nije poznata, ali su poznate određene metode koje ovaj objekt implementira zbog protokola na koji odgovara.

    Protokoli su vrlo korisni i za pronalaženje sličnosti između klasa koje nisu hijerarhijski povezane jer se klase u različitim granama hijerarhije nasljeđivanja mogu povezati ako odgovaraju istom protokolu.

    Klasa1 *objekt1;
    Klasa2 *objekt2;

    Ako Klasa1 i Klasa2 implementiraju isti protokol, mogu se smatrati sličnima jer odgovaraju istom protokolu.

  • Leave a Reply