继承
XXX是XXX
一,概念:
1,应该分析下两个类里面如果有相同的成员变量或方法,就可以抽取它们的共同点作为一个父类。如:狗和锚
2,当A类完全拥有B类的部分属性,可以用B类继承A类。
二,注意:有些情况下是不行的
在什么情况下不能使用?
如:Score父类,Student子类,下的C成绩和OC成绩。这设计不合逻辑。所以这里可以用组合。
三,组合
XXX拥有XXX
四,super关健字
它也是用在父类和子类里面,和self一样好用,同时类方法这些都一样。
作用:可以调用父类的某些方法,在哪个方法中就调用哪个方法,类/对象。
重写的概念:拷贝父类的行为到子类,再扩充成为自己。
使用场合: 重写父类想保留的一些行为
下面利用代码来说明概念:
#import <Foundation/Foundation.h>
//提前了解下内存管理:对象不用后就要手动移除,在以前的开发中通过代码来移除。
//以前ios开发中50%是和内存相关的。有了ARC自动管理,所以现在代码清简了很多。
//相同的方法和成员变量,所以用一个相同的类装起来。
@interface Animal : NSObject
{
int _age;
double _weight;
}
- (void)setAge:(int)age;
- (int)age;
- (void)setWeight:(double)weight;
- (double)weight;
@end
@implementation Animal
- (void)setAge:(int)age
{
_age = age;
}
- (int)age
{
return _age;
}
- (void)setWeight:(double)weight
{
_weight = weight;
}
- (double)weight
{
return _weight;
}
@end
//:Dog继承了Animal,相当于拥有了Animal里面所有的变量和方法
// Dog是子类
// Animal是父类
@interface Dog : Animal
@end
@implementation Dog
@end
@interface Cat : Animal
@end
@implementation Cat
@end
int main()
{
Dog *d = [Dog new];
[d setAge:10];
NSLog(@"age = %d",[d age]);
return 0;
}
五,好处:
1,抽取重复的代码,如:成员变量,方法。
2,建立了类之间的关系。子类可以拥有父类所有的属性和方法。重要的是父类也继承了根类NSObject,OC中所 有基本的类都是继承它(包括new方法,所以才有创建对象能力)。NSProxy除外。
下面是self使用,代码表示;
#import <Foundation/Foundation.h>
@interface Person : NSObject
{
int _age;
}
- (void)setAge:(int)age;
- (int)age;
- (void)run;
+ (void)test1;
@end
@implementation Person
- (void)setAge:(int)age
{
_age = age;
}
- (int)age
{
return _age;
}
- (void)run
{
NSLog(@"student----run");
}
+ (void)test1
{
NSLog(@"this is test1");
}
@end
//这里的子类不能放在父类前,必须放在后面。
@interface Student : Person
{
//int _age;
//会报错,OC里不能扩充一个和父类同名的成员变量.但方法要可以同名。但这样的话,父类声明方法,在子类实现也可以。
//重写。子类重写父类。
//每个类都会加到内存中
//坏处:偶合性太强,就是这个类不见,另外一个类也用不了。
}
+ (void)test;
@end
@implementation Student
+ (void)test
{
[self test1];//这里可以指向父类,调用父类的方法为自己所用。
}
@end
//--------------------
int main()
{
Student *s = [Student new];
[s run];
//它优先到Student里找run方法,再去父类找,再往上找。
return 0;
}
六,关于组合
#import <Foundation/Foundation.h>
// XXX拥有XXX
@interface Score : NSObject
{
int _cScore;
int _ocScore;
}
@end
@implementation Score
@end
//-------------
@interface Student : NSObject //组合的写法
{
Score *_score; //Score *_XXX 组合的写法
//int _cScore;
//int _ocScore;
int _age;
}
@end
@implementation Student
@end
int mian()
{
return 0;
}
七,super关健字
#import <Foundation/Foundation.h>
@interface Zoombie : NSObject
- (void)walk;
+ (void)test;
- (void)test;
@end
@implementation Zoombie
- (void)walk
{
NSLog(@"zoom走两步!!!!!!");
}
+ (void)test
{
NSLog(@"这个是test one");
}
- (void)test
{
NSLog(@"这个是test two");
}
@end
//-----------
@interface JumpZoonbie : Zoombie
+ (void)haha;
- (void)haha2;
@end
@implementation JumpZoonbie
+ (void)haha
{
[super test]; //子类是+号,所以调用父类的+号,调用了类方法test.
}
- (void)walk
{
NSLog(@"zoom再走两步--");
//这里有个父类的方法[self walk];会死循环。[super walk]可以调用父类方法。
//NSLog(@"zoom走两步!!!!!!");
[super walk]; //super的使用
}
- (void)haha2
{
[super test]; //super的使用
}
@end
int main()
{
//JumpZoonbie *jz = [JumpZoonbie new];
//[jz walk];
//[JumpZoonbie haha];
JumpZoonbie *jz = [JumpZoonbie new];
[jz haha2];
return 0;
}