home *** CD-ROM | disk | FTP | other *** search
/ Chip 2000 August / Chip_2000-08_cd1.bin / obsahy / Chip_txt / TXT / 160-161.TXT < prev    next >
Encoding:
Text File  |  2000-06-29  |  7.7 KB  |  123 lines

  1. Programovßnφ v prost°edφ Cocoa (4)
  2. Vφce o Objective C
  3. V minulΘm dφlu jsme se seznßmili se systΘmem objekt∙ a ukßzali jsme si vÜechny zßkladnφ slu₧by jazyka Objective C. Nynφ se seznßmφme se zbytkem konstrukcφ, je₧ Objective C nabφzφ; aΦkoli ₧ßdnß z nich nenφ pro programovßnφ bezpodmφneΦn∞ nutnß. JednoduchΘ testovacφ progrßmky jste si snadno mohli vyzkouÜet u₧ s vyu₧itφm slu₧eb popsan²ch minule û dokß₧φ programßtorovi v²razn∞ usnadnit ₧ivot.
  4.  
  5. Neobjektovß rozÜφ°enφ
  6. Jazyk Objective C je urΦen p°edevÜφm pro prßci s objekty; neobjektov²ch rozÜφ°enφ v n∞m proto mnoho nenalezneme. Ta, je₧ zde jsou, jsou vÜak velmi p°φjemnß. Prv²m z nich je mo₧nost pou₧φvat komentß° "//" stejn∞ jako v C++ (to ji₧ nep°φmo vyplynulo z p°φklad∙ v minulΘm dφlu, kde byly takovΘ komentß°e pou₧φvßny). Druh²m je standardizace typu a hodnot pro logickΘ (booleovskΘ) prom∞nnΘ: ani₧ by byl naruÜen standardnφ p°φstup jazyka C, slou₧φ jako logick² typ typ BOOL a odpovφdajφcφ hodnoty jsou YES a NO. Standardnφ headery prost∞ definujφ:
  7.  
  8. typedef int BOOL;
  9. #define YES 1
  10. #define NO 0
  11.  
  12. p°φpadn∞ v jazyce C ekvivalentnφ typedef enum {NO, YES} BOOL, jeho₧ v²hodou je, ₧e konstanty YES a NO jsou znßmy i na ·rovni debuggeru.
  13. Velmi Üikovn²m rozÜφ°enφm je direktiva #import. Ta funguje tΘm∞° stejn∞ jako klasickß direktiva #include; p°ekladaΦ ale zajistφ, ₧e ka₧d² zdrojov² soubor se bude p°eklßdat nejv²Üe jednou. V Objective C si proto m∙₧eme uÜet°it nepohodlnΘ obklßdßnφ ka₧dΘho hlaviΦkovΘho souboru direktivami typu
  14.  
  15. #ifndef _STDIO_H_
  16. #define _STDIO_H_
  17. ...
  18. #endif
  19.  
  20. Je snad trochu spornΘ, zda mezi neobjektovß rozÜφ°enφ m∙₧eme °adit novΘ typy, hodnoty a identifikßtory: krom∞ typ∙ id a Class a hodnot nil a Nil, je₧ znßme ji₧ z minulΘho dφlu, nabφzφ Objective C nßsledujφcφ typy a hodnoty:
  21. Typy:
  22. SEL    vnit°nφ reprezentace zprßvy
  23. IMP    metoda (p°φm² ukazatel na metodu, pou₧φvan² pro statick² p°φstup)
  24.  
  25. Identifikßtory
  26. id self    v implementaci metody reprezentuje objekt, kter² metodu zpracovßvß
  27. id super        dtto, ale jeho metody jsou vyhledßvßny v rodiΦovskΘ t°φd∞
  28. SEL _cmd    v implementaci metody reprezentuje zprßvu, je₧ metodu vyvolala
  29. Typ SEL reprezentuje zprßvu a je definovßn jako celoΦφselnß hodnota, na kterou je zprßva intern∞ p°elo₧ena. Spolu s direktivou @selector, je₧ zprßvy p°evßdφ na tento typ, umo₧≥uje zprßvy uklßdat do prom∞nn²ch, vzßjemn∞ porovnßvat a podobn∞. Typ IMP  vlastn∞ nenφ niΦφm jin²m ne₧ ukazatelem na funkci a vyu₧φvß se v t∞ch zcela v²jimeΦn²ch p°φpadech, kdy pot°ebujeme volat metodu rychleji ne₧ prost°ednictvφm mechanismu zprßv. Ukßzky praktickΘho pou₧itφ naleznete v p°φkladech na CD; totΘ₧ platφ i pro vÜechny ostatnφ konstrukce.
  30. Poznamenejme, ₧e pro dosa₧enφ statickΘ typovΘ kontroly srovnatelnΘ s C++ nabφzφ Objective C mo₧nost pou₧φvat na mφst∞ typu id konstrukci "ukazatel na t°φdu" s v²znamem "objekt danΘ t°φdy nebo jejφho d∞dice". Je vhodnΘ zd∙raznit, ₧e jde pouze o statickou, p°ekladovou kontrolu û na v²sledn² program to nemß v∙bec ₧ßdn² vliv, ten bude fungovat stejn∞ dob°e (nebo stejn∞ Üpatn∞), jako kdybychom vÜude d∙sledn∞ pou₧φvali id.
  31. Dφky tomu, ₧e self, super a _cmd jsou identifikßtory, a ne klφΦovß slova (jako je tomu nap°. v nedomyÜlenΘm C++), m∙₧eme je bez jak²chkoli problΘm∙ p°edefinovat; p°ekladaΦ Objective C proto bez problΘm∙ p°elo₧φ "obyΦejn² cΘΦkov²" program, ve kterΘm je pou₧ita nap°φklad prom∞nnß jmΘnem self.
  32.  
  33. P°φstup k prom∞nn²m
  34. Prom∞nnΘ objektu mohou b²t k dispozici pouze jeho vlastnφm metodßm, nebo i metodßm vÜech jeho d∞dic∙, nebo û ve v²jimeΦn²ch p°φpadech, kdy z n∞jakΘho d∙vodu musφme rezignovat na objektovΘ programovßnφ a vyu₧φvat statickΘ programßtorskΘ techniky û mohou b²t prom∞nnΘ p°φstupnΘ z jakΘhokoli ·seku k≤du. Mo₧nosti p°φstupu k prom∞nn²m jsou urΦeny pou₧itφm jednΘ ze t°φ direktiv:
  35. @private    prom∞nnΘ jsou p°φstupnΘ pouze metodßm objektu samotnΘho;
  36. @protected    prom∞nnΘ jsou p°φstupnΘ i d∞dic∙m (tento p°φstup je standardnφ, nepou₧ijeme-li ₧ßdnou z direktiv);
  37. @public    prom∞nnΘ jsou p°φstupnΘ komukoli.
  38. Jestli₧e z n∞jakΘho d∙vodu musφme rezignovat na objektov² p°φstup, m∙₧eme takΘ zφskat neomezen² p°φstup k prom∞nn²m kterΘhokoli objektu pomocφ direktivy @defs.
  39.  
  40. Kategorie
  41. Primßrnφm ·Φelem kategoriφ je umo₧nit rozlo₧enφ implementace jednΘ slo₧itΘ t°φdy do n∞kolika zdrojov²ch soubor∙. Kategorie mß rozhranφ i implementaci obdobnΘ standardnφm, avÜak na mφst∞ nad°φzenΘ t°φdy je jmΘno kategorie v zßvorkßch. Kategorie samoz°ejm∞ nem∙₧e definovat vlastnφ prom∞nnΘ; mß vÜak voln² p°φstup k prom∞nn²m definovan²m v zßkladnφm rozhranφ t°φdy.
  42. Dejme tomu, ₧e mßme nßsledujφcφ t°φdu:
  43.  
  44. @interface Xxx:Yyy
  45. -aaa;
  46. -bbb;
  47. -ccc;
  48. @end
  49.  
  50. vΦetn∞ odpovφdajφcφ implementace
  51.  
  52. @implementation Xxx
  53. -aaa { ... }
  54. -bbb { ... }
  55. -ccc { ... }
  56. @end
  57.  
  58. Pokud by pro nßs bylo z jakΘhokoli d∙vodu v²hodnΘ odd∞lit od sebe implementace t∞chto t°φ metod do samostatn²ch celk∙, mohli bychom stejn∞ dob°e pou₧φt zßkladnφ t°φdy a dvou kategoriφ û z hlediska prßce s t°φdou Xxx a jejφmi objekty by se nezm∞nilo v∙bec nic:
  59.  
  60. @interface Xxx:Yyy // zßkladnφ t°φda
  61. -aaa;
  62. @end
  63. @interface Xxx (KategorieProMetoduB)
  64. -bbb;
  65. @end
  66. @interface Xxx (AProMetoduCcc)
  67. -ccc;
  68. @end
  69.  
  70. Obdobn∞ by samoz°ejm∞ byla rozd∞lena i implementace.
  71. Kategorie navφc umo₧≥ujφ dopl≥ovat nebo m∞nit ji₧ existujφcφ t°φdy: dejme tomu, ₧e bychom cht∞li, aby libovoln² objekt dokßzal reagovat na zprßvu where jmΘnem poΦφtaΦe, na kterΘm b∞₧φ proces, v rßmci n∞ho₧ objekt existuje. V Objective C nenφ nic jednoduÜÜφho û prost∞ implementujeme kategorii
  72.  
  73. @interface NSObject (ReportWhere)
  74. -(NSString*)where;
  75. @end
  76.  
  77. @implementation NSObject (ReportWhere)
  78. -(NSString*)where
  79. {
  80.   return [[NSProcess Info processInfo] hostName];
  81. }
  82. @end
  83.  
  84. Jakmile mßme kategorii hotovu, m∙₧eme novou slu₧bu zcela voln∞ pou₧φvat u kterΘhokoli objektu.
  85.  
  86. Protokoly
  87. Protokol v zßsad∞ nenφ niΦφm jin²m ne₧ seznamem metod; pou₧φvß se jako spoleΦn² prvek pro specifikaci t°φd, kterΘ majφ mφt spoleΦnΘ metody, ale nejsou strukturßln∞ p°φbuznΘ (Φφm₧ nahrazuje implementaΦn∞ i programßtorsky obtφ₧nou vφcenßsobnou d∞diΦnost C++ v tom jedinΘm p°φpad∞, kdy m∞la jak²si smysl).
  88. Protokol je definovßn obdobn∞ jako rozhranφ, nem∙₧e vÜak samoz°ejm∞ obsahovat prom∞nnΘ. Protokoly vÜak mohou mφt svou vlastnφ d∞diΦnost. Namφsto direktivy @interface je zde pou₧ita direktiva @protocol. KonkrΘtnφ p°φklad naleznete op∞t na CD.
  89.  
  90. Ostatnφ
  91. Objective C nabφzφ jeÜt∞ dv∞ direktivy, @class a @encode. Prvß z nich prost∞ informuje p°ekladaΦ o existenci t°φdy danΘho jmΘna a slou₧φ pro dop°ednΘ reference:
  92.  
  93. @class Xxx;
  94. @interface Yyy
  95. -(Xxx*)xxx;
  96. @end
  97. @interface Xxx
  98. -(Yyy*)yyy;
  99. @end
  100.  
  101. Direktiva @encode slou₧φ pro dynamickou specifikaci typu, v praxi se vÜak tΘm∞° v∙bec nepou₧φvß (proto₧e pln∞ objektov² systΘm dynamickΘ typy vlastn∞ nepot°ebuje û namφsto nich se pou₧φvajφ objekty, je₧ si typovou informaci nesou implicitn∞ v sob∞); jejφ podrobn² popis si proto m∙₧eme odpustit.
  102.  
  103. Shrnutφ
  104. DokonΦili jsme struΦn² popis jazyka Objective C; ti, kdo majφ jeho p°ekladaΦ k dispozici (jako GNU C je k dispozici na libovolnΘ platform∞, od Mac OS X p°es vÜechny unixovΘ varianty a₧ po DOS Φi Windows), v n∞m mohou psßt libovolnΘ testovacφ programy.
  105. P°φÜt∞ se u₧ zaΦneme bavit o skuteΦn²ch vlastnostech prost°edφ Cocoa: ukß₧eme si mechanismus tvorby a zßniku objekt∙ a podobn∞.
  106. Ond°ej ╚ada 
  107.  
  108. Na Chip CD p°ilo₧enΘm k tomuto Φφslu Chipu je pro lepÜφ ilustraci °ada bohat∞ komentovan²ch p°φklad∙ jednoduch²ch program∙:
  109. P°φklad 1: Vyu₧itφ p°eddefinovan²ch t°φd (knihovny t°φd NeXTstepu)
  110. P°φklad 2: Tvorba vlastnφ t°φdy
  111. P°φklad 3: D∞diΦnost a vklßdßnφ objekt∙
  112. P°φklad 4: DynamickΘ rozpoznßnφ t°φdy
  113. P°φklad 5: Sklßdßnφ objekt∙ a dynamickΘ rozpoznßnφ zprßv
  114. P°φklad 6: Sklßdßnφ objekt∙ a dynamickΘ rozpoznßnφ zprßv û jinß varianta
  115. P°φklad 7: Mechanismus klient/server
  116. P°φklad 8: Statick² p°φstup k objekt∙m
  117.  
  118.  7/00: 737-Cocoa4 (Au.╚ada - 4.16 n.str., 1,7 TS) Strana: 3
  119.  
  120.     Chyba! Neznßm² argument p°epφnaΦe./1
  121.  
  122.  
  123.