2009-03-20 6 views
5

Widzę dużo kodu, takie jak następujące jako z opóźnieniem:Jak działa protokół dotyczący zmiennej instancji w Objective-C?

id<foo> aBar; 

Zazwyczaj jest to coś, co widzę w deklaracji klasy, takie jak:

@interface bar : UIViewController <UITableViewDelegate, UITableViewDataSource> 

Czy powyżej średniej że aBar może być instancją klasy i obiecuje, że wszystkie metody zostaną zadeklarowane w protokole foo?

Odpowiedz

16

Zamknij. Oznacza to, że aBar będzie instancją klasy zgodnej z protokołem foo. Może to być bar (jeśli klasa jest zgodna z foo) lub inną klasą, która jest zgodna z foo. Z tej deklaracji wynika, że ​​aBar jest zgodny z protokołem.

Są one również sprawdzane tylko podczas kompilacji, a nie w czasie wykonywania. Możliwe jest umieszczenie obiektu w aBar, który nie jest instancją klasy zgodnej z foo. Ale kompilator ostrzeże cię o tym w większości przypadków.

+0

Sądzimy, że w pytaniu i odpowiedzi może być podmiana "foo" i "bar". Jego "pasek" klasy nie przyjmuje protokołu foo, więc kompilator narzekałby na przechowywanie instancji "paska" na "a Bar", jak jest napisane. –

+0

Nie sądzę, że wystąpił błąd wymiany, ale masz rację, jeśli chodzi o klasę pręta niezgodną z protokołem foo. Myślę, że jego ostatni akapit wyjaśnia, dlaczego tak to napisał. –

0

Dokładnie. Protokoły oznaczają, że nie dziedziczysz klasy, ale dostaje ona prototypy tej klasy. W ten sposób dowiesz się, jakie są niedostatki metod, gdy próbujesz wejść w interakcję z obiektem, który wymaga tych metod. Pomyśl o płytkim interfejsie w języku C#.

Mówię C#, ponieważ jest to mój podstawowy język. :)

Powiązane problemy