Add description and example of how to simulate protected methods.

This commit is contained in:
Levi Bostian 2014-01-08 21:55:20 -06:00
parent e3b20c7e26
commit e3853e564b

View File

@ -430,7 +430,12 @@ distance = 18; // References "long distance" from MyClass implementation
return @42; return @42;
} }
<<<<<<< HEAD
// To create a private method, create the method in the @implementation but not in the @interface // To create a private method, create the method in the @implementation but not in the @interface
=======
// Objective-C does not have private method declarations, but you can simulate them.
// To simulate a private method, create the method in the @implementation but not in the @interface.
>>>>>>> 421f48c... Add description and example of how to simulate protected methods.
- (NSNumber *)secretPrivateMethod { - (NSNumber *)secretPrivateMethod {
return @72; return @72;
} }
@ -485,11 +490,11 @@ distance = 18; // References "long distance" from MyClass implementation
@end @end
// Now, if we wanted to create a Truck object, we would create a subclass of Car instead as it would // Now, if we wanted to create a Truck object, we would instead create a subclass of Car as it would
// be changing the functionality of the Car to behave like a truck. But lets say we want to just add // be changing the functionality of the Car to behave like a truck. But lets say we want to just add
// functionality to this existing Car. A good example would be to clean the car. So we would create // functionality to this existing Car. A good example would be to clean the car. So we would create
// a category to add these cleaning methods: // a category to add these cleaning methods:
// @interface filename: Car+Clean.h // @interface filename: Car+Clean.h (BaseClassName+CategoryName.h)
#import "Car.h" // Make sure to import base class to extend. #import "Car.h" // Make sure to import base class to extend.
@interface Car (Clean) // The category name is inside () following the name of the base class. @interface Car (Clean) // The category name is inside () following the name of the base class.
@ -499,8 +504,8 @@ distance = 18; // References "long distance" from MyClass implementation
@end @end
// @implementation filename: Car+Clean.m // @implementation filename: Car+Clean.m (BaseClassName+CategoryName.m)
#import "Car+Clean.h" #import "Car+Clean.h" // Import the Clean category's @interface file.
@implementation Car (Clean) @implementation Car (Clean)
@ -517,7 +522,7 @@ distance = 18; // References "long distance" from MyClass implementation
#import "Car+Clean.h" // Import as many different categories as you want to use. #import "Car+Clean.h" // Import as many different categories as you want to use.
#import "Car.h" // Also need to import base class to use it's original functionality. #import "Car.h" // Also need to import base class to use it's original functionality.
int main(int argc, const char *argv[]) { int main (int argc, const char * argv[]) {
@autoreleasepool { @autoreleasepool {
Car *mustang = [[Car alloc] init]; Car *mustang = [[Car alloc] init];
mustang.color = @"Red"; mustang.color = @"Red";
@ -529,6 +534,24 @@ int main(int argc, const char *argv[]) {
return 0; return 0;
} }
// Objective-C does not have protected method declarations but you can simulate them.
// Create a category containing all of the protected methods, then import it ONLY into the
// @implementation file of a class belonging to the Car class:
@interface Car (Protected) // Naming category 'Protected' to remember methods are protected.
- (void)lockCar; // Methods listed here may only be created by Car objects.
@end
//To use protected methods, import the category, then implement the methods:
#import "Car+Protected.h" // Remember, import in the @implementation file only.
@implementation Car
- (void)lockCar {
NSLog(@"Car locked."); // Instances of Car can't use lockCar because it's not in the @interface.
}
@end
// Protocols // Protocols
// A protocol declares methods that can be implemented by any class. // A protocol declares methods that can be implemented by any class.