Kategori ve Sınıf Uzantısı arasındaki fark?


85

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.



3
Akusete, sayfa bulunamadı.
Adil Hussain

burada açıkça gösterilmiştir, code.tutsplus.com/tutorials/…
grassyburrito

Yanıtlar:


103

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:

  1. Kategorinin adı yoktur. Şöyle ilan edilir:

    @interface SomeClass ()
    
    
    - (void) anAdditionalMethod;
    
    @son
  2. Uzantı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).


13
Class-Extensiosn'da, dahili olarak okunmak üzere salt okunur bir özellikten (genel) özelliklerin üzerine yazabilirsiniz. Ve LLVM 1.5'ten bu yana daha fazlasını da yapabilirsiniz: artık bir sınıf uzantısında örnek değişkenleri bildirebilir, böylece normal arayüzden çıkmış olursunuz.
Max Seelemann

Bu yöntemleri ve özellikleri sınıfa uygulayabilecekken neden bir sınıf uzantısı eklemelisiniz? Bana biraz gereksiz görünüyor.
user1721803

1
@ user1721803 Dave'in önerdiği gibi, birkaç özelliği / yöntemi açığa çıkarmamak isteyebilirsiniz. Bu, uzantıların kullanıldığı zamandır. Bir görünüm düşünün, tüm IBOutlet'lerinizi ve IBActions'ınızı uzantıya bağlayabilir ve Çıkışları başlatmaya / güncellemeye izin veren yöntemleri açığa çıkarabilir ve Eylemler geri devredilebilir.
GoodSp33d

@MaxSeelemann, kısa bir komut dosyasıyla "dahili olarak okunacak (genel) bir salt okunur özelliğin" nasıl yapılacağını gösterebilir misiniz? Teşekkürler.
allenlinli

Bu cevap "Class + CategoryName.swift" dosyasındaki uzantıyı belirtir, doğru mu?
Ritesh.mlk

47
  1. Kategori

=> 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.

  1. Sınıf Uzantısı
-> 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

  • Kategoride sınıfın sahibi değilsiniz, ancak uzantı olarak sizsiniz.

5
@Prasanna: sınıf uzantısı yalnızca .m dosyasıyla birlikte gelir ve .h biçiminde değil
Saggy

1
sınıf uzantısı yalnızca bir .h dosyasıyla birlikte gelir ve .m değil
Nishu_Priya

32
  1. 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.

  2. Sınıf uzantısına fazladan örnek değişkenleri ve özellikler ekleyebiliriz, ancak kategoriye ekleyemeyiz.

  3. Uzantı içindeki herhangi bir değişken ve yönteme devralınan sınıflar için bile erişilemez.

  4. 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.

  5. 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.


3
Birçok cevabı olan 5 benzer soru okudum ve bu en iyisi. Teşekkür ederim!
Honey

1
Kategoriye de özellikler ekleyebilirsiniz. @Pebby yanıtına bakın.
atulkhatri

7

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.


Sade ve zarif. Devam edin
Abdul Yasin

3

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/


2
@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


Bu, bir kategori değil, bir kategori değil -> @interface SomeClass ()
ChavirA

0

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ı


4
cevabınız tıpkı "kedi kaplana benzer, kör bir adama cevap verir" gibi. Lol
Muruganandham K

1
aslında değil. C # veya java biliyorsanız en doğrudan ve hızlı açıklamadır.
Add080bbA

Hiç tanımlayıcı değil ve soruyu zar zor cevapladı.
KVISH

0

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


0

İş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.


Biraz yoldan çıkıyorsun.
Abdul Yasin

@iPhoneDeveloper Uzantıyı önceden tanımlanmış tipler için yazabiliriz. Lütfen bu bağlantıyı kontrol edin - stackoverflow.com/a/33942484/2060508
yo2bh
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.