Gå till innehåll
Just nu i M3-nätverket

@protocol i Obj-C


easy

Rekommendera Poster

Hej,

 

Jag sitter och försöker lära mig att programmera lite med Objective-C. Det har gått ganska bra hittills men har nu fastnat lite eftersom jag inte riktigt får koll på hur protocol och delegates fungerar.

Har ganska bra koll på properties, men är det någon som har en bra förklaring på när och varför man använder protocol? Har läst några guider angående detta och det verkar väldigt rörigt. Kanske blir lättare att förstå om man får det förklarat på svenska.

 

Tack på förhand!

Länk till kommentar
Dela på andra webbplatser

Jag tar det på engelska tycker det beskriver vad ett protokoll är ganska bra: (Saxat från boken Cocoa Programming for Mac OS X)

"The Objective-C language has a construct called a protocol, which is identical to the Java construct called an interface. That is, a protocol is a list of method declarations. When you create a class that implements a protocol, it promises to implement all the methods in the protocol."

 

I och med Objective-C 2.0 finns även @optional som tillägg till protokoll vilket ger en utvecklare möjligheten att säga vilka metoder som man valfritt kan implementera i ett protokoll. Ett protokoll är exempelvis NSCoding som finns i Cocoa. Ett tips är att köpa boken "Cocoa Programming for Mac OS X" av Aaron Hillegrass. Där får du bra exempel på det mesta som rör Cocoa

Länk till kommentar
Dela på andra webbplatser

Du kan tex samla alla #defines, actions, tags, enums m.m i ett protocol. Så brukar jag göra, din kod blir lite renare på det viset och så är det lättare att hålla koll på dom. Då behöver du bara göra en #import "dittProtocol.h" där du behöver dom.

Länk till kommentar
Dela på andra webbplatser

Har försökt läsa på lite mer, vet inte om jag har förstått det rätt men jag tolkar det som att Class1 deklarerar en metod och bestämmer att något ska utföras med ett objekt. Class1 bestämmer dock inte vad som ska utföras. Detta implementeras istället i Class2. Men det är Class1 som kallar på metoden och skickar med objektet (som i många fall är self).

 

Har jag förstått den grundläggande funktionen för protokoll rätt?

Länk till kommentar
Dela på andra webbplatser

Bägge sakerna du har funderat över, protokoll och delegation är ofta mer teoretiskt förklarade. Det beror på att de faktiskt oftast är mer teoretiska begrepp än rent kodartade. Därför är det nog lättare att tänka på protokoll som deklarationer, definitioner eller mer som bara ett slags begrepp som inte är fullt ut gripbara. Med en implementation av ett protokoll ges en mening åt dessa tidigare flyktiga termer. T.ex. en metod har för avsikt att "skriva ut". Du implementerar kanske denna som att putta ut tecken till en skrivare. Men du kan även putta ut tecken till en bildskärm. Bägge implementationer skulle kunna ses som korrekta för samma protokoll ... Diskussionen om delegater är också lite knepig då den dels hänvisar till teori, men också mer av kod än kanske protokoll gör ...

Länk till kommentar
Dela på andra webbplatser

Ett protokoll definierar egenskaper kan man säga. Alltså om ett objekt är utskrivbart så implementerar man protokollet utskrivbar i objeketets klass. Ett protokoll är bara en samling medot deklarationer som säger vilken typ av argument den tar och vad den skall returnea för typ. Sedan är det upp till dig som programmerar dina egna klasser att implementera en vettig logik i metodkroppen för de protokoll du vill använda. Du kanske har en klass faktura och vill använda ett protokoll som heter utskrivningsbar (printable) i det protokollet finns bara en metood som heter print() som inte returnerar något och tar inga argument. Det du gör då är att du skriver in metoden i din klass och sedan så väljer du helt själv hur du skall skriva ut din klass genom att göra en vettig metodkropp till print() som fungerar för din klass.

 

Detta exempel är kanske inte verkligt men det belyser ungefär hur protokoll är tänkta att användas.

 

I ditt lilla program kanske du även har en klass som heter Person som du också vill kunna skriva ut och då måste du precis som här deklarera att du vill använda protokollet utskrivningsbar och implementera metoden print() i klassen Person, men med kanske en helt annan metodkropp. Då Person och Faktura har helt olika saker som skall skrivas ut. Dock så vet du med säkerhet att du kan kalla på print() från alla objekt som tillhör båda klasserna och få dom utskrivna. Fiffigt va :).

 

Hoppas det hjälpte.

Länk till kommentar
Dela på andra webbplatser

Så ett protokoll har alltså ingen funktion i sig utan är endast en hjälp för att strukturera upp programmet? Speciellt om man är flera utvecklare på samma projekt.

 

För om jag vill kunna skriva ut ett objekt så kanske jag t.ex. alltid behöver printToPrinter(), printToFile(), printToScreen(). Jag kan ju då deklarera dessa i alla klasser som skapar objekt som ska kunna skrivas ut. Men då kan jag istället skriva ett protokoll där jag deklarerar printToPrinter(), printToFile(), printToScreen() och behöver då bara deklarera protokollet i varje klass för att få samma resultat. Implementeringen av dessa metoder sker dock i varje klass oavsett hur jag gör.

 

Eller får jag någon koppling mellan två klasser som deklarerar samma protokoll som jag inte får om jag istället deklarerar metoderna direkt i dessa två klasser?

 

 

Länk till kommentar
Dela på andra webbplatser

Jo, det är något åt det hållet. Intressant vinkling med tanken på att det är av skälet olika utvecklare som är inblandade skulle inverka på valet av "protokoll". Tänker man på hur XP utvecklades mot en närmast psykologisk modell för programmering, så är det fullt tänkbart med en slags psykologisering av objekt-orienteringen. Men. Hur intressant just den tolkningen är med avseende på olika typer av s.k. "utvecklingsmetoder" så är det inte på det viset. Deklarationen av protokoll används för att hålla sig till en objekt-orienterad syn på programmeringen. Precis som man kan använda vissa begrepp i matematiken på många olika sätt för att lösa samma problem. Jo, det har funnits till exempel vanliga prototyper när man kör vanlig C för metoder, och finns har jag för mig i ANSI C. Men de har ju varit mer av typen "förenkla kompilering och länkning". Likaså är det med "header" filer. I princip skulle man klara sig utan uppdelningen i "deklarationsfiler" och "implementationsfiler". Men det finns återkoppling även här tillbaka till programspråk som skiljer, abstraherar deklarationer från implementationer. Nu förenklar jag väldigt, men tankestrukturen finns där. Det som är det spännande med "protokoll" i Objective-C är att det tillhör sfären av objekt-orientering. Det hänvisar på sätt och vis till hur objekt-orienteringen skall kunna lösas (i viss mån) genom kodning i Objective-C. Ju mer man lär sig om objekt-orietering ju mer inser man hur själva abstraktionen fungerar och hur programspråken (som praktiska instrument) fungerar. Dessutom kan man se kopplingar mellan olika programspråk, och hur de löser objekt-orienteringens syfte. Om du är intresserad av denna koppling kan rekommenderas Timothy Budd som skrivit flera böcker med just mycket hänvisningar till Objective.C, då han är en gammal hängiven Mac-programmerare ...

Länk till kommentar
Dela på andra webbplatser

Okej, min tanke på flera utvecklare var att när man vill deklarera metoden kanske man inte vet alls vad den klass som kommer att implementera kommer att heta om man är flera utvecklare på ett stort projekt och då kan kanske ett protokoll vara en bra lösning för att kunna göra den deklarationen. Jag har bara sysslat med lite enklare PHP applikationer tidigare så jag har nog inte fått tänket med objekt orientering att fastna riktigt än. Det kommer väl mer allt eftersom. Men nu har jag lite grundläggande förståelse för vad man kan använda protokoll till och kan gå vidare i mina "studier". Blir garanterat lättare att förstå lite djupare längre fram.

 

Tack så mycket för att ni tog er tid med att försöka förklara.

Länk till kommentar
Dela på andra webbplatser

 

Eller får jag någon koppling mellan två klasser som deklarerar samma protokoll som jag inte får om jag istället deklarerar metoderna direkt i dessa två klasser?

 

Den koppling du får med protokoll är att du kan skapa tex en array av utskrivbara objekt och sedan kalla på dina print metoder genom att gå igenom din array och kalla på varje objekts printmetoder och kompilatorn kommer att säga att det är ok då dessa garanteras kunna svara på anropet då dom alla har deklarerat att dom följer protokollet "printable". Detta kan du annars inte göra i ett språk som är statisk typat. (Jo man kan det men det anses som att man inte kodar på rätt sätt då samt att det blir svårt för kompilatorn att hjälpa dig med "type checking" och maskinkods optimering exempelvis). Kanske en liten onödig fördjupning men hoppas det hjälpte lite.

 

Kan som set_lo även rekommendera budds böcker om objektorientering. Dom är mycket bra för att få förståelse för denna ganska komplexa programmerings paradigm.

 

 

 

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.



×
×
  • Skapa nytt...