多态练习

来源:互联网 发布:linux root鉴定错误 编辑:程序博客网 时间:2024/06/11 11:03

需求:修改游戏相关类 将怪物类和英雄类提取公共部分,并定义成父类。 修改游戏,使用多态完善怪物、英雄的攻击。

Role.h

@interface Role : NSObject{    int _hp;    int _oriHp;    CGPoint _currentLoc;    CGPoint _oriLoc;    int _attack;    int _defense;}@property(nonatomic,assign)int hp;@property(nonatomic,assign,readonly)int oriHp;@property(nonatomic,assign)CGPoint currentLoc;@property(nonatomic,assign,readonly)CGPoint oriLoc;@property(nonatomic,assign)int attack;@property(nonatomic,assign)int defense;-(Role *)initWithHp:(int)aHp         CurrentLoc:(CGPoint)aCurrentLoc             Attack:(int)aAttack            Defense:(int)aDefense;+(Role *)RoleWithHp:(int)aHp         CurrentLoc:(CGPoint)aCurrentLoc             Attack:(int)aAttack            Defense:(int)aDefense;-(void)move;-(void)attackSomebody:(Role *)aRole;-(void)escape;@end

Role.m

#import "Role.h"@implementation Role@synthesize hp = _hp,            oriLoc = _oriLoc,            oriHp = _oriHp,            currentLoc = _currentLoc,            attack = _attack,            defense = _defense;-(Role *)initWithHp:(int)aHp         CurrentLoc:(CGPoint)aCurrentLoc             Attack:(int)aAttack            Defense:(int)aDefense{    self = [super init];    if (self)    {        CGPoint p = {100,100};        _oriLoc = p;        _oriHp = 100;                self.hp = aHp;        self.currentLoc = aCurrentLoc;        self.attack = aAttack;        self.defense = aDefense;    }    return self;}+(Role *)RoleWithHp:(int)aHp         CurrentLoc:(CGPoint)aCurrentLoc             Attack:(int)aAttack            Defense:(int)aDefense{    Role *r = [[Role alloc]init];    return r;}-(void) move{    CGPoint p = self.currentLoc;    p.x++;    p.y++;}-(void) attackSomebody:(Role *)aRole{    }-(void) escape{      NSLog(@"逃跑");}@end

Hero.h

#import "Role.h"@interface Hero : Role{    NSString *_name;}@property(nonatomic,retain)NSString *name;-(Role *)initWithHp:(int)aHp         CurrentLoc:(CGPoint)aCurrentLoc             Attack:(int)aAttack            Defense:(int)aDefense               Name:(NSString *)aName;+(Role *)RoleWithHp:(int)aHp         CurrentLoc:(CGPoint)aCurrentLoc             Attack:(int)aAttack            Defense:(int)aDefense               Name:(NSString *)aName;@end

Hero.m

#import "Hero.h"#import "Monster.h"@implementation Hero@synthesize name = _name;-(Role *)initWithHp:(int)aHp         CurrentLoc:(CGPoint)aCurrentLoc             Attack:(int)aAttack            Defense:(int)aDefense               Name:(NSString *)aName{    self = [super initWithHp:aHp                    CurrentLoc:aCurrentLoc                    Attack:aAttack                    Defense:aDefense];    if (self)    {        self.name = aName;    }    return self;}+(Role *)RoleWithHp:(int)aHp         CurrentLoc:(CGPoint)aCurrentLoc             Attack:(int)aAttack            Defense:(int)aDefense               Name:(NSString *)aName{    Role *r = [[Role alloc]init];    return r;}-(void)attackSomebody:(Role *)aRole{    Monster *aMonster =(Monster *)aRole;    aMonster.hp -= self.attack;    NSLog(@"monster hp = %d",aMonster.hp);}@end

Monster.h

#import "Role.h"@interface Monster : Role@end

Monster.m

#import "Monster.h"#import "Hero.h"@implementation Monster-(void)attackSomebody:(Role *)aRole{    Hero *aHero = (Hero *)aRole;    aHero.hp -= self.attack;    NSLog(@"hero hp = %d",aHero.hp);}@end

AppDelegate.m

#import "AppDelegate.h"#import "Role.h"#import "Monster.h"#import "Hero.h"@implementation AppDelegate- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];    // Override point for customization after application launch.    self.window.backgroundColor = [UIColor whiteColor];        CGPoint p = {100,100};    Role *hero = [[Hero alloc]initWithHp:100                               CurrentLoc:p                                   Attack:30                                  Defense:80                                     Name:@"superman"];    Role *monster = [[Monster alloc]initWithHp:100                                    CurrentLoc:p                                        Attack:20                                       Defense:30];    [hero attackSomebody:monster];    [monster attackSomebody:hero];            [self.window makeKeyAndVisible];    return YES;}

 

0 0
原创粉丝点击