类与类之间的关系就像是所有的人都属于人这个类,而人这个类里又有一部分是残疾人,残疾人又可以变为一个类,也就是说人这个类里其实是可以包含残疾人这个类的,人类里的属性也可以是残疾人这个类里的属性,这里就涉及到一个继承的问题,也就是说相对于孩子和父亲的关系,人这个类就是父类,而残疾人这个类就是子类。OC中的继承其实就像现实中的父子关系,儿子继承了父亲的遗产,而派生就是父亲生了不止一个儿子。
这里有两个概念,一个是基类一个是父类,我理解的其实他们是一种东西,所以没必要再这里纠结。
继承:派生类继承基类。
派生类不但拥有基类的方法和属性,还拥有新增的方法和属性。
基类的私有属性能被继承,不能被访问
OC的继承是单继承,即一个类只能是继承一个父类,不能继承多个父类
方法的重写:
把父类的方法重写在子类中实现,做子类该做的事情,用子类调用父类的重写方法是,先调用自己类中的重写方法,若自己类中无该方法,则找父类的方法,如果还没有就找父父类,知道找到基类(NSObject)为止。
比如重写desription方法:
当我们以%@的格式打印了对象此时调用了desription方法,打印出来的就是当前类的地址,这样的话其实用NSLog输出的意义就不大,因为我们不关心他的地址,关心的是一些成员变量的值。所以会经常重写desription方法,覆盖desreption方法的默认实现,以达到我们自己所要达到的目的。
desription方法的实例:
Dog *d = [Dog new];
[d setAge:3];
d->_color = 1;
//查看对象地址
NSLog(@"\n d = %p",d);
//类名 对象的地址
//需求:
//当我们以%@格式打印 对象的时候,输出对象的所有的属性信息
NSLog(@"\n%@",d); //打印d的对象
此时我们打印出来的并不能满足上诉的需求,打印出来的是一个Dog的地址,想要满足上诉需求就呀重写desription方法,代码如下:
@implementation Dog
-(void)setAge:(int)age{
_age = age;
}
-(int)age{
return _age;
}
-(void)run{
NSLog(@"狗在跑");
}
//重写父类的description
-(NSString *)description{
return [NSString stringWithFormat:@"年龄:%d,颜色:%d",_age,_color];
}<pre name="code" class="objc">int main(int argc,const char * argv[])
{
<pre name="code" class="objc"> Dog *d=[Dog new];
[d class]; ---->Dog
//以%@的形式,打印类信息
NSLog(@"\n%@ ",[d class]);
return 0;
}
这样重写以后就能满足需求了。
在这里再介绍几个访问成员变量的修饰符:
@public类型在子类中正常访问,在任意程序都能访问。
@protected在同一类或派生类中可以访问(如果不专门声明的话,编译器默认就是此类型)。
@private只能访问同意类型的成员变量,子类不能继承不能访问。
OC类中的私有方法:在类的.h中没有声明,在.m中实现了此方法称为私有方法。