2011-08-21 12 views
67

Rozszerzenia klasy @interface Class() są o wiele potężniejsze i mogą wprowadzać zmienne do klasy. Kategorie @interface Class (Category) nie można.Rozszerzenie klasy a kategoria klasy

Jakie są inne różnice i kiedy należy użyć kategorii w stosunku do rozszerzenia klasy?

+0

kategorie to rzeczywisty kod. to sposób dodawania funkcji do klasy. rozszerzenia są (w kategoriach bardzo ogólnych) bardziej po prostu syntaktycznym cukrem, aby zasygnalizować pewne idee dotyczące prywatności itp. innym programistom. rozszerzenia nie zawierają kodu i nie są kodami. – Fattie

+0

W przypadku rozszerzeń używanych w Swift zobacz to pytanie: http://stackoverflow.com/questions/24142829/how-to-create-swift-class-for-category – Suragch

Odpowiedz

77

Główna różnica polega na tym, że przy rozszerzeniu kompilator będzie wymagał zastosowania metod w ramach głównej wersji @implementation, natomiast w przypadku kategorii ma osobny blok @implementation. Tak więc powinieneś używać rozszerzenia tylko na szczycie głównego pliku .m (jedyne miejsce, w którym powinieneś dbać o ivars, nawiasem mówiąc) - to ma być właśnie to, rozszerzenie.

+3

Ale jaki jest sens używania rozszerzenia Kategoria? – David

+32

Rozszerzenie najlepiej nadaje się do prywatnych metod, które chciałbyś zadeklarować w swoim pliku '.m'. Używam go do tego przez cały czas. Kategorie są bardziej przydatne, gdy chcesz pogrupować swoje metody w różne sekcje - * kategorie * :) - lub gdy chcesz dodać kod do istniejących klas, które nie zostały utworzone. – jtbandes

+1

Możesz również dodać dodatkową pamięć jako rozszerzenia klas, korzystając z właściwości. –

3

Kategorie to funkcja języka Objective-C, która umożliwia dodawanie nowych metod do istniejącej klasy. Rozszerzenia są szczególnym przypadkiem kategorii, które umożliwiają definiowanie metod, które muszą zostać zaimplementowane w głównym bloku implementacji.

Prywatne deklaracje mogą być w rozszerzeniach klas, które są głównie niektórymi właściwościami, ponieważ nie musimy zadeklarować metody przed jej wywołaniem.

+0

"która musi zostać zadeklarowana w głównym bloku wdrożeniowym." -> to musi być "zaimplementowane" w głównym bloku implementacyjnym – Fawkes

+0

Dzięki, zmieniłem go. –

0

ios przedłużenie podobny do C#, Java klasy abstrakcyjnej lub interfejsu
kategoria ios podobny do c przedłużacza # klasa

+0

Java nie obsługuje metod rozszerzeń – someUser

+0

Niestety! Skopiuj i wklej literówkę. Kategoria ios podobna do rozszerzenia klasy C#. – Add080bbA

15

Rozszerzenie klasy wykazuje pewne podobieństwo do kategorii, ale można dodawać tylko do klasy, dla których masz kod źródłowy w czasie kompilacji (klasa jest kompilowana w tym samym czasie, co rozszerzenie klasy). Metody zadeklarowane przez rozszerzenie klasy są zaimplementowane w @implementation bloku dla oryginalnej klasy, więc nie można na przykład zadeklarować rozszerzenia klasy w klasie framework, takiej jak klasa Cocoa lub Cocoa Touch, jak NSString.

składnia zadeklarować rozszerzenia klasa jest podobna do składni dla danej kategorii, a wygląda to tak:

@interface ClassName() 
@end 

Ponieważ żadna nazwa podana jest w nawiasie, rozszerzenia klasy są często określane jako anonimowe kategoriach .

W przeciwieństwie do zwykłych kategorii rozszerzenie klasy może dodawać do klasy własne właściwości i zmienne instancji. Jeśli zadeklarujesz nieruchomości w rozszerzeniu klasy tak:

@interface XYZAnimal() { 
    id _someCustomInstanceVariable; 
} 
... 
@end 

IMHO, najlepiej myśleć o rozszerzeniach klasy jako prywatny interfejs do klasy. Główny interfejs (w twoim pliku .h) działa jako interfejs publiczny, który definiuje klasową umowę behawioralną z innymi klasami.

rozszerzenia użyć klasy ukryć Prywatna Informacja

rozszerzenia klasy są często wykorzystywane do rozszerzenia interfejsu publicznego z dodatkowych metod prywatnych lub właściwości do zastosowania w realizacji samej klasie. Powszechne jest na przykład definiowanie właściwości jako tylko do odczytu w interfejsie, ale jako readwrite w rozszerzeniu klasy zadeklarowanym powyżej implementacji, aby wewnętrzne metody klasy mogły bezpośrednio zmienić wartość właściwości.

Jako przykład, klasa XYZPerson może dodać właściwość o nazwie uniqueIdentifier, zaprojektowaną do śledzenia informacji takich jak numer ubezpieczenia społecznego w USA.

Zazwyczaj wymaga dużej ilości dokumentów, aby mieć unikalny identyfikator przypisany do konkretnej osoby w rzeczywistym świecie, więc interfejs klasy XYZPerson może zadeklarować tę właściwość jako readonly i podać metodę, która żąda przypisania identyfikatora, np. to:

@interface XYZPerson : NSObject 
    ... 
    @property (readonly) NSString *uniqueIdentifier; 
    - (void)assignUniqueIdentifier; 
@end 

aby klasa XYZPerson móc zmienić właściwość wewnętrznie, ma sens redeclare właściwość w rozszerzeniu klasy, który jest zdefiniowany w górnej części pliku wdrażania dla klasy:

@property (readwrite) NSString *uniqueIdentifier; 

Uwaga: Atrybut readwrite jest opcjonalny, ponieważ jest domyślny. Możesz go użyć podczas redeclaracji nieruchomości, dla jasności.

-1

Kategorie to sposób na rozszerzenie API istniejących klas, a rozszerzenia są sposobem dodawania wymaganych metod do interfejsu API poza głównym plikiem interfejsu. Oba zostały początkowo zaprojektowane, aby zmniejszyć obciążenie związane z utrzymaniem dużych baz kodów.

Ostrzeżenia używania Kategoria:

1- nie można wiarygodnie zastępują metody zdefiniowane w kategoriach do tej samej klasy.

2- Kategoria nie może dodawać zmiennych instancji. Oznacza to, że nie możesz zadeklarować nowych właściwości.

Dotyczy: Objective-C Succinctly: Categories and Extensions. Zawiera szczegółową dyskusję z przykładami.

Powiązane problemy