ios - How to get all elements returned by a method include those defined from super class? -
i'm writing json <> model serializer. 1 of feature ignore properties model when converting json. i'm letting model implement - (nsarray *)ignoreproperties
method tell serializer properties should ignore. needs support inheritance. i'm stuck how combine array elements object , super classes.
@protocol serializermapping <nsobject> - (nsarray *)ignoreproperties; @end @interface basemodel : nsobject <serializermapping> @property nsstring *baseproperty; @end @implementation basemodel - (nsarray *)ignoreproperties { return nil; // nothing ignore } @end // --- @interface supermodel : basemodel @property nsstring *property1; @property nsstring *property2; @end @implementation supermodel - (nsarray *)ignoreproperties { return @[@"property1"]; } @end // --- @interface awesomemodel : supermodel @property nsstring *property3; @property nsstring *property4; @end @implementation awesomemodel - (nsarray *)ignoreproperties { return @[@"property3"]; } @end // --- serializer awesomemodel *obj = [awesomemodel new]; nsarray *blacklist = [obj ignoreproperties]; // returns "property3"
obviously above code doesn't work how can implement ignoreproperties
so, return property1
, property3
?
very bad way:
@implementation awesomemodel - (nsarray *)ignoreproperties { return [[super ignoreproperties] arraybyaddingobjectsfromarray:@[@"property3"]]; } @end
a lot of potential bugs. if subclass forgets invoking super
chain broken. or basemodel
return nil
code wouldn't work @ all.
i think teamnorge on right track code won't work posted, though, since array isn't mutable.
make property mutable array. have base class create it init's init method:
in base class header:
@property (nonatomic, retain) nsmutablearray *ignoreproperties;
then in init base class:
-(instancetype) init; { self = [super init]; if (!self) return nil; self.ignoreproperties = [@[@"property1"] mutablecopy]; }
and in init subclass:
-(instancetype) init; { self = [super init]; if (!self) return nil; [self.ignoreproperties addobject: @"property2"]; //or add multiple objects... nsarray *newproperties = @[@"property2", @"property3"]; [self.ignoreproperties addobjectsfromarray: newproperties]; }
for efficiency's sake, might better make array immutable , have subclass's init method replace array created using arraybyaddingobject
or arraybyaddingobjectsfromarray
. (immutable objects less costly system mutable forms. in case array of properties created once @ initialization of class, , persist it's lifetime.)
Comments
Post a Comment