Say I have 2 classes: Money and Dollar, where Dollar inherits from Money.
Money has a property declared in a class extension:
#import "Money.h"
@interface Money ()
@property(nonatomic) NSUInteger amount;
@end
@implementation Money
@end
Dollar inherits this property, but it's not visible from methods in Dollar. I can "fix", by redeclaring the property in Dollar.m:
@interface Dollar ()
@property(nonatomic) NSUInteger amount;
@end
@implementation Dollar
}
@end
I really dislike this and I'm not even sure that I know what the compiler is doing:
What's the best way to have a property hidden from everyone except the implementation of the class and its subclasses?
Ideally, I would not like amount to be visible in the .h file, as it's an implementation detail.
In answer to the first question, probably the first option. Its just smooshing everything together for Money
at compile time. Compilers and Pre-Compilers are clever.
You can use private headers to accomplish what you are trying to do
A public header file Money.h
//Money.h
@interface Money : NSObject
//public decl
@end
A private header file for subclasses Money-Private.h
//Money-Private.h
@interface Money ()
@property(nonatomic) NSUInteger amount;
@end
Which is used by the implementation of Money
and any subclasses or categories e.g
The public face of dollar Dollar.h
#import "Money.h"
@interface Dollar:Money
@end
and the implementation Dollar.m
#import "Money-Private.h"
@implementation Dollar
-(void)foo
{
self.amount = 75;
}
@end
Should you ever choose to create a public framework then make sure only the public headers get copied into the bundle.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With