------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
有了通俗的例子之后,理解分类应该容易很多了。
严格的说,分类的作用就是不改变类原有代码的基础上,为类添加一些方法,也只能添加方法,并不能添加成员变量。作为同一个类,分类可以访问原类声明中的成员变量。
分类的优先级很高,如果在分类中重新实现了一个原类的方法,那么使用的时候会优先调用分类。
说起方法调用的优先级:“分类 > 类 > 父类”。也就是说,在分类能找到的方法,编译器不会再去其他地方寻找。若寻找不到,则去原类或者父类甚至父类的父类中去寻找。
搜索
复制