2009-07-09 17 views
10

Şu anda Objective-C'yi öğreniyorum ve Protokollerde isteğe bağlı yöntemlerle karşılaşıyorum. Arka planım C# ve C# Arabirimine benzer bir şey olarak bir Protokol görebiliyor.@optional protocol methodlarının gerçek dünya örnekleri

Bir C# Arabirimi bir sözleşmeyi temsil ettiğinde, bir Arayüzün reklamını yaparak, tanımlanan yöntemleri uygulayacağınızı söylüyorsunuz.

Bunun akılda tutulmasıyla, neden isteğe bağlı bir yöntem tanımlamanız gerektiğine dair kafam karışmış durumda. Bu slur veya Objective-C'yi azaltma girişimi değil, Objective-C'yi seviyorum. Dilin daha iyi anlaşılmasını sağlamak için bu isteğe bağlı yöntemlerin faydalarını anlamak istiyorum.

Eğer birisi, isteğe bağlı yöntemlerin yararlı olduğu bazı gerçek dünya senaryoları (örnek kod ile) sağlayabilirse bunu takdir ediyorum.

cevap

14

Size bir örnek vereceğim. Flickr API'sı ile konuşan bir dizi ObjC sınıfım var. FKAccount adı verilen bir kullanıcı, bir Flickr kullanıcısının hesabıyla ilgili, kullanıcının fotoğraflarını indirmek, kişi listesini almak vb.

FKAccount sınıfı bir temsilci protokolü FKAccountDelegate'u tanımlar. Bu protokol FKAccount'un çeşitli ağ işlemlerinin Flickr'a başarılı olmasına veya başarısız olmasına bağlı olarak delege üzerinde çalacağı bir dizi geri arama yöntemini belirtir. FKAccount'u kullanan her uygulama, FKAccount'un gerçekleştirebileceği her Flickr işlemiyle ilgilenmeyecektir.

FKAccountDelegate protokolünü uygulamakla yükümlü olan her sınıfın her yöntemi uygulamış olsaydı, çok fazla saplama yöntemi ile sonuçlanırdınız (FWIW, FKAccountDelegate'da tanımlanan 41 yöntem vardır). Bu yöntemler protokolde @optional bildirildiğinde, temsilci yalnızca almak istediği geri çağrıları uygulamak gerekir. onun temsilci tarafından protokolde @optional yöntemlere tepki verdiğini

FKAccount sınıf kontrolleri:

if([self.delegate respondsToSelector: @selector(accountDidDownloadContacts:)]) { 
    [self.delegate accountDidDownloadContacts: self]; 
} 
+0

sanırım şimdi alıyorum düşünüyorum. Bir C# Arayüzü, bir Objective-C Protokolünün sadece bir yüzüdür. Protokolü sözleşme olarak kullanabilirsiniz, ancak bu isteğe bağlı yöntemler, bir nesnenin de yanıt vermeyi seçebileceği isteğe bağlı temsilciler listesi oluşturur. Bu gerçekten ilginç. – kim3er

+1

+1 Temsilci işlevlerini belgelemek için bir protokol kullanmak için –

+1

Tamamen katılıyorum @Tom. Objective-C 2.0 öncesinde, temsilci yöntemleri, tüm yöntemleri uygulamak zorunda kalmadan bir temsilci olmak isteyen sınıflardan kaçınmak için genellikle NSObject'teki bir kategoride bildirilmiştir. Protokollerde isteğe bağlı yöntemler, NSObject üzerinde tonlarca yöntemi ele geçirmeyen ve yöntem çakışmalarını önlemeye yardımcı olan çok daha temiz bir çözümdür. Yalnızca Java'nın isteğe bağlı arabirim yöntemleri varsa, MouseAdapter'den devralma gibi şeylere gerek kalmaz. Bunun gibi sınıfları kullanmak genellikle tek mirasa lanetlediğim birkaç kat ... –

İlgili konular