黑马程序员——从类说开去,说开去,开去,去......

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

在对面向对象编程有了一定了解之后,已经可以自己写写简单的程序了。在自己的程序里制造世界,这种感觉就好像天下在手。

不过万事开头难。在“创造万物”之前先来造两个人吧 !


@interface Person : NSObject
{	
	NSString *_name;
}
@end

@implementation Person
@end
int main (int argc, const char *argv[]) 
{ 
    Person *p1 = [Person new];
    
    person *p2 = [Person new];
    return 0;
}


由于众所周知的原因,这两个人恐怕叫做亚当和夏娃。那么:


Person *p1 = [Person new];
person *p2 = [Person new];
//做个setName方法给他们命名:

- (void)setName:(NSString *)name
{
     _name = name;
}


[p1 setName:@"Adam"];
[p2 setName:@"Eve"];

好了,现在我们有了2个人,一个人是亚当,一个夏娃。

他们做点什么好呢?

历史的车轮总是不停的旋转,果不其然吃了苹果。


声明一下:

- (void)eatApple;

再实现一下:

- (void)eatApple
{	
	NSLog(@"他们竟然吃了苹果!!!!");
}

木已成舟。亚当和夏娃都吃掉了苹果有了人的智慧。那么是谁引诱的他们呢?

没错,是撒旦(satan)。让撒旦也登场吧。


<pre name="code" class="objc">@interface Snake : NSObject
{	
	NSString *_name;
}
- (void)setName:(NSString *)name;
@end

@implementation Snake
- (void)setName:(NSString *)name
{
      _name = name;
}
@end


 不能做无名蛇。 

Snake *s = [Snake new];
[Snake setName:@"Satan"];

之后的故事我们也知道。亚当和夏娃“变聪明”之后,生下了两个孩子。名字分别是该隐(Gain)和亚伯 (Abel)。

在类里也有这种表示这种传承关系的代码,叫做“继承”。


@interface Child : Person
//冒号表示Child 继承自 Person
@end
@implementation Child
@end


由于继承了Person类,所以,CHild类一出现就具有了_name属性以及 setName 和 eatApple的方法,并不需要再声明或者实现。

这就是继承的力量啊!


Child *c1 = [Child new];
Child *c2 = [Child new];
[c1 setName:@"Gain"];
[c2 setName:@"abel"];
[c1 eatApple];

但是从圣经里知道,该隐和亚伯在出生后,并不安生,最后该隐杀掉了自己的亲兄弟亚伯。


摊手。果然子类也会有自己独特的“方法”啊。

- (void)kill
{
      NSLog(@"该隐杀掉了亚伯! ");
}

子类Child,也就是c1,c2,在声明了自己的函数之后就可以直接调用了。

[c1 kill];
[c2 kill];


说完了西方的神话故事。再回到小时候我们看过的动画片《葫芦娃》!

这里可以使用分类(category)概念。

先创建一个葫芦兄弟的类吧 。



@interface Brothers : NSObject
- (void)sayMyName;
@end

@implementation Brothers
- (void)sayMyName
{
	NSLog(@"我们是葫芦兄弟!")
}
@end

那么分类是怎么使用的呢?

回忆一下,是不是每一个葫芦娃都有自己的本领呢?这就是分类的概念了。


@interface Brothers (1st)
- (void)qianLiYan;
@end
@implementation Brothers (1st)
- (void)qianLiYan
{
	NSLog(@"千里眼!");
}
@end
@interface Brothers (2nd)
- (void)shunFengEr;
@end
@implementation Brothers (2nd)
- (void)shunFengEr
{
	NSLog(@"顺风耳!");
}
@end

有了通俗的例子之后,理解分类应该容易很多了。

严格的说,分类的作用就是不改变类原有代码的基础上,为类添加一些方法,也只能添加方法,并不能添加成员变量。作为同一个类,分类可以访问原类声明中的成员变量。

分类的优先级很高,如果在分类中重新实现了一个原类的方法,那么使用的时候会优先调用分类。

说起方法调用的优先级:“分类 > 类 > 父类”。也就是说,在分类能找到的方法,编译器不会再去其他地方寻找。若寻找不到,则去原类或者父类甚至父类的父类中去寻找。


























  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值