我有一个Person对象,其中包含name , email , birthdate等内容。
我还有一个名为Member的Person子类,其中包含yearJoined , title等内容。
在我的代码中,如何将现有Person转换为Member ? 例如:
Member *mem = self.person;我收到编译错误,因为类不匹配。 但是子类应该继承其父类的所有属性,所以我正在寻找一种方法来说“这个Person对象现在应该是一个Member对象”。
那有意义吗?
I have a Person object which contains things like name, email, birthdate, etc.
I also have a subclass of Person called Member, which contains things like the yearJoined, title, etc.
In my code, how can I take an existing Person and convert it to a Member? For example:
Member *mem = self.person;I'm getting compiler errors because the classes don't match. But the subclass should inherit all the properties of its parent, so I'm looking for a way to just say "this Person object should now be a Member object."
Does that make sense?
最满意答案
一种方法是在Member类中声明initWithPerson类方法和memberFromPerson静态方法:
@interface Member : Person { NSString *title; ... } - (id)initWithPerson:(Person *)aPerson title:(NSString *)aTitle; + (Member *)memberFromPerson:(Person *)aPerson title:(NSString *)aTitle; @end在您的实施中:
@implementation Member - (id)initWithPerson:(Person *)aPerson title:(NSString *)aTitle { if (self = [super initWithName:aPerson.name email:aPerson.email birthdate:aPerson.birthdate]) { self.title = aTitle; } return self; } + (Member *)memberFromPerson:(Person *)aPerson title:(NSString *)aTitle { return [[Member alloc] initWithPerson:aPerson title:aTitle]; } @end然后,当您想将Person实例转换为Member ,您只需要调用:
Member *newMember = [Member memberFromPerson:myPerson title:@"New member!"];当然,您可以自定义所有这些,具体取决于其他变量(如title或year)是否需要加入(您可以创建memberFromPerson:的版本memberFromPerson:如果正确初始化所有内容,则不需要任何其他参数)。
One way to do that would be to declare an initWithPerson class method and a memberFromPerson static method in your Member class:
@interface Member : Person { NSString *title; ... } - (id)initWithPerson:(Person *)aPerson title:(NSString *)aTitle; + (Member *)memberFromPerson:(Person *)aPerson title:(NSString *)aTitle; @endAnd in your implementation:
@implementation Member - (id)initWithPerson:(Person *)aPerson title:(NSString *)aTitle { if (self = [super initWithName:aPerson.name email:aPerson.email birthdate:aPerson.birthdate]) { self.title = aTitle; } return self; } + (Member *)memberFromPerson:(Person *)aPerson title:(NSString *)aTitle { return [[Member alloc] initWithPerson:aPerson title:aTitle]; } @endThen when you want to convert your Person instance into a Member, you just need to call:
Member *newMember = [Member memberFromPerson:myPerson title:@"New member!"];Of course you can customize all this depending on how the other variables like title or year joined are required or not (you can create a version of memberFromPerson: without any other argument if you initialize everything properly).
更多推荐
发布评论