#import <Foundation/Foundation.h>
@interface Base: NSObject {
@private
int _a;
#import <Foundation/Foundation.h>
#import "Base.h"
@interface SubClass: Base {
int _a;
因此,无论父类接口部分的成员变量使用何种访问控制符限制,子类接口部分定义的成员变量都不允许与父类接口部分定义的成员变量重名。
而在类实现部分定义的成员变量将被限制在该类的内部,因此,父类在类实现部分定义的成员变量对子类没有任何影响。无论是接口部分还是实现部分,子类定义的成员变量都可以与父类实现部分定义的成员变量同名。
反过来也一样,在子类实现部分定义的成员变量也不受父类接口部分定义的成员变量的影响。也就是说,即使在父类的接口部分定义了名为 _a 的成员变量,子类的实现部分依然可以定义名为 _a的成员变量。
当子类实现部分定义了与父类重名的成员变量时,子类的成员变量就会隐藏父类的成员变量。因此,子类方法很难直接访问到父类的成员变量,此时可通过调用父类的方法来访问父类
下面我们可以创造一种情况,代码如下:
#import <Foundation/Foundation.h>
@interface Parent: NSObject {
int _a;
- (void) setA: (int)a;
- (int) a;
#import <Foundation/Foundation.h>
#import "Parent.h"
@implementation Parent
- (void) setA: (int)a {
_a = a;
- (int) a {
return _a;
- (id) init {
if (self = [super init]) {
self -> _a = 5;
return self;
#import <Foundation/Foundation.h>
#import "Parent.h"
@interface Sub: Parent
- (void) accessOwner;
#import <Foundation/Foundation.h>
#import "Sub.h"
@implementation Sub {
int _a;
- (id) init {
if (self = [super init]) {
self -> _a = 7;
return self;
- (void) accessOwner {
NSLog(@"子类中_a成员变量的值为:%d", _a);
NSLog(@"父类中被隐藏的_a成员变量的值为:%d", super.a);
#import <Foundation/Foundation.h>
#import "Sub.h"
int main(int argc, char* argv[]) {
@autoreleasepool {
Sub* c = [[Sub alloc] init];
[c accessOwner];
return 0;
最终的运行结果为:
子类中_a成员变量的值为:7
父类中被隐藏的_a成员变量的值为:5
从上方的代码中可以看出程序通过 super 关键字强制指定调用父类的 _a 属性(实际上就是获取 getter 方法返回值),通过这种方式可以访问到父类中被隐藏的成员变量。
从上面的运行结果可以看到,在子类实现部分定义与父类同名的成员变量,只是隐藏父类的成员变量,虽然程序只是创建了一个 Sub 对象,但该对象内部依然有两块内存来保存 a成员变量,其中一块内存保存父类中被隐藏的 _a 成员变量,可以通过父类中定义的方法来访问; 另一块内存保存子类实现部分定义的 _a 成员变量,可以在子类方法中直接访问。
编写面向对象的程序的时候,类和对象之间存在一定的关系
处理类和对象之间的关系的时候,尤其需要注意OOP的两个方面:
一个就是继承,创建一个新类的时候,通常需要定义新类以区别于
其他类和现有类,使用继承可以定义一个具有父类所有功能的新类。
现在有两个类:
@interface Circle:NSObject
ShapeColor fillCo
一个新类可以从已有的类派生出来,这个过程称为继承,新类称为子类,已有的类称为父类或超类。
2.继承的特点:
实现代码重用:子类可以重用父类的实例变量和方法。
子类可以增加实力变量和方法扩展父类,但不能重载父类的实例变量
所有类型都有一个公共基类:NSObject
3.NSObject类
允许定义自己的根类,但通常不这样做,而是利用现有的类
一、概念:面向对象提供了继承语法,能大大简化代码。把公共的方法和实例变量写在父类里,子类字需要写自己独有的实例变量和方法即可。继承既能保证类的完整,又能简化代码。二、继承的特点:OC 中只允许单继承。
没有父类的类成为根类,OC中的根类是NSObject(祖宗)。
继承的内容:所有实例变量和方法。
如果子类不满意父类方法的实现,可以重写(overwrite)父类的方法。三、方法调度机制:当代码
我们可以通过对父
类的
继承实现一定的扩展,
继承主要有以下几种典型的用法:
1 代码复用。.两个
类有部分相同的代码,那相同的部分我们就没必要去复制粘贴,完全就可以把公共的部分放在父
类中,子
类去
继承,只需要实现一次相同的部分即可。
2.创建协议
类。父
类为子
类规定了一些方法,哪怕是空的,但我们可以默认为父
类为他的子
类创建了一种协议,当不同的
类实现同名的方法的时候,程序就可以采用多态的设计。
- (void) setYear: (int) iYear;
- (void) primalSetData: (int)iYear :(int)iMonth :(int)iDay;
- (void) setData: (int)Year iMonth:(int)iMonth iDay:(int)iDay;
今天学习了Objective-C中有关类继承的知识。先纪录如下:
1)OOP编程中有两个技术 用于描述类与类或对象与对象之间的关系;一个是继承 另一个是复合。
2)在Objective-C中每个子类只能有一个超类,这一点与c++不同。
3)方法调度程序
该调度程序的功能非常重要,当一个对象接收到一个消息后,调度程序会在接收对象的类中查找与该消息对应的方法,如果没有找到调度程序就...
继承方法
1.保留父
类 对该方法的实现,(不用重写)2.案子
类重写之后的方式来实现,(重写,忽视父
类的实现)3.既有父
类对该方法的实现,又有子
类对该方法的实现.
继承的上层: 父
类 ,
继承的下层:子
类
继承是单向的,不能相互
继承。