Kategori ve Sınıf Uzantısı arasındaki fark nedir? Her ikisinin de mevcut sınıflara özel yöntemler eklemek için kullanıldığına inanıyorum. Birisi buna ışık tutabilir mi? Kod ile örnekleme gerçekten takdir edilecektir.
Kategori ve Sınıf Uzantısı arasındaki fark nedir? Her ikisinin de mevcut sınıflara özel yöntemler eklemek için kullanıldığına inanıyorum. Birisi buna ışık tutabilir mi? Kod ile örnekleme gerçekten takdir edilecektir.
Yanıtlar:
Kategori, mevcut sınıflara yöntem eklemenin bir yoludur. Genellikle, "NSView + CustomAdditions.h" (ve tabii ki .m) gibi "Class + CategoryName.h" adlı dosyalarda bulunurlar.
Sınıf uzantısı, 2 ana fark dışında bir kategoridir:
Kategorinin adı yoktur. Şöyle ilan edilir:
@interface SomeClass ()
- (void) anAdditionalMethod;
@sonUzantının uygulanması , dosyanın ana @ uygulama bloğunda olmalıdır .
Bir .m dosyasının en üstünde, sınıf üzerinde daha fazla yöntem bildiren bir sınıf uzantısı görmek oldukça yaygındır, bunlar daha sonra aşağıda, sınıfın ana @ uygulama bölümünde uygulanır. Bu, "sözde-özel" yöntemleri bildirmenin bir yoludur (sözde-özel, gerçekten özel olmadıklarından, sadece dışarıdan açığa çıkmadıklarından).
=> Hedef C'de, kalıtım olmadan bir sınıfa daha fazla işlevsellik eklemek istediğinizde, bunun için kategoriyi kullanmanız yeterlidir.
=> kendi .h ile birlikte gelir ve .m dosyasıyla
=> Categoryözellikleri değil yeni yöntemi eklemek için kullanır.
-> In Objective C, when you want to make behaviour of some property private you use class extension.
-> it comes with **.h** file only.
-> mainly for properties.
Not: Yeni bir dosya ekleyip hedef c kategorisinden bir seçenek belirlediğimizde, kategoriyi ve "alt sınıfı" değil, "kategoriyi" gösterir, böylece şöyle görünür:
@interface className (categoryName)
@end
-Sen iki dosya alacak .h ve .m (aynı dosya adıyla sınıfadı + categoryName.h ve sınıfAdı + kategoriAdı.m ) şeklinde
ve uzatma durumunda alacaksınız
@interface className()
@end
-SınıfAdı_uzantıAdı.h adında yalnızca bir dosya alacaksınız
Kategori, kaynak kodun mevcut olup olmadığına bakılmaksızın bir sınıfa yöntemler eklemenin bir yoludur, yani temel sınıflara kategori ekleyebilirsiniz. NSString kendi özel sınıflarınız .
Uzantı yalnızca kaynak kodu mevcut olan sınıflara eklenebilir, çünkü derleyici kaynak kodunu ve uzantıyı aynı anda derler.
Sınıf uzantısına fazladan örnek değişkenleri ve özellikler ekleyebiliriz, ancak kategoriye ekleyemeyiz.
Uzantı içindeki herhangi bir değişken ve yönteme devralınan sınıflar için bile erişilemez.
Kategori ve uzantıların her ikisi de temelde büyük kod tabanını işlemek için yapılır, ancak kategori birden fazla kaynak dosyada sınıf API'sini genişletmenin bir yoludur, uzantı ise ana arabirim dosyasının dışına gerekli yöntemleri eklemenin bir yoludur.
Aynı sınıf kodunuzu farklı işlevlere göre farklı kaynak dosyalara bölmeniz gerektiğinde kategoriyi ve ana arayüz dosyası dışında mevcut sınıfa bazı gerekli yöntemleri eklemeniz gerektiğinde uzantıyı kullanın. Ayrıca, bir sınıftaki genel olarak bildirilmiş bir örnek değişkenini değiştirmeniz gerektiğinde, örneğin, salt okunur olarak yeniden yazmak için, onu uzantı içinde yeniden bildirebilirsiniz.
Uzantı : Yöntemleri özel yapmak ve Apple sınıfının değil, kendi özel sınıfımızın özelliklerini eklemek.
Kategori : Özelliğe değil, var olan sınıfa daha fazla yöntem eklemek için, hem özel sınıf hem de Apple sınıfı için kullanılabilir NSString.
Ayrıca kategori sınıfında set ilişkili özelliği kullanan özelliklere de sahip olabiliriz.
@interface SomeClass (Private)
@property (nonatomic, assign) id newProperty;
@end
NSString * const kNewPropertyKey = @"kNewPropertyKey";
@implementation SomeClass (Private)
@dynamic newProperty;
- (void)setNewProperty:(id)aObject
{
objc_setAssociatedObject(self, kNewPropertyKey, aObject, OBJC_ASSOCIATION_ASSIGN);
}
- (id)newProperty
{
return objc_getAssociatedObject(self, kNewPropertyKey);
}
@end
Bakın: http://inchoo.net/dev-talk/ios-development/how-to-add-a-property-via-class-category/
@interface SomeClass ()
- (void) anAdditionalMethod;
@end
Kategori ilan etmenin bir yolu olmadığını düşünüyorum. Kategorinin bir adı olmalıdır
@interface SomeClass (XYZ)
- (void) anAdditionalMethod;
@end
Örneğin
@interface NSMutableArray (NSMutableArrayCreation)
+ (id)arrayWithCapacity:(NSUInteger)numItems;
- (id)initWithCapacity:(NSUInteger)numItems;
@end
Apple tarafından NSMutableArray için beyan edildi
ios uzantısı c # ile benzer, java soyut sınıfı veya
c # ile benzer arayüz
ios kategorisi, java sınıfı uzantısı
Kategoriler
Kategoriler çok sayıda yöntem içeren dosya oluştururken kullanılır, bu nedenle size tek bir sınıfı farklı modüllere ayırma olanağı sağlar.Ayrıca, kategorilerde herhangi bir değişiklik yapılırsa derleyici tüm projeyi derlemek için zaman kaybetmez Kategoriler yeni değişken veya özellikler ekleyemez ve üst sınıflarına bakamaz.Bir kategorideki bir yöntemi geçersiz kılabilirsiniz, ancak bu iyi bir fikir değildir, çünkü yöntem daha fazla geçersiz kılınamaz.Ayrıca, tüm kategoriler aynı hiyerarşik seviye ve dolayısıyla aynı ana sınıfa ait iki kategori çalışma zamanında mevcut olabilir. Ayrıca, kategoriler kullanılarak korumalı yöntemler oluşturulabilir.
Uzantılar
Uzantılar, özelliği geçersiz kılmanıza veya mevcut üst sınıfa yeni özellik eklemenize olanak tanır. Adı olmayan kategorilere sözdizimsel olarak aynı ve @ arayüz sınıfı () olarak temsil edilir. M dosyası yok ve uzantıda bildirilen yöntem uygulanmalıdır. üst dosyanın @ uygulamasında
Bu bağlantıda daha fazla yardım
İşte anladığım kadarıyla:
Uzantılar genellikle kendi " özel sınıfımıza ekstra özellikler eklemek için kullanılır " . Sınıfın gerçeklenmesinde kullanılabilecek sınıf arayüzünü genişleten özel yöntemler veya özellikler ekleyebiliriz.
Uzantılar, sınıfla aynı dosya içine yazılacaktır. Dolayısıyla String, Float, vb. Gibi önceden tanımlanmış türler için uzantılar yazamazsınız.
Öte yandan Kategoriler, önceden var olan sınıflara ekstra yöntemler eklemek için kullanılabilir. Örnek String sınıfını genişleterek kendi yöntemlerimizi oluşturabiliriz. Ekstra mülk oluşturamayacağımızı unutmayınKategorilerde . Ayrıca kategorilerin temel avantajı, kategorileri sınıfınızın çıktığı dosyanın dışında başka herhangi bir dosyaya yazabilmemizdir.
Ayrıca kategoriler oluştururken parantez içinde ona bir isim vermeniz gerekiyor. Ancak uzantı için isim gerekmez. Bu nedenle, bazen anonim kategoriler olarak da adlandırılırlar.