1. 关于成员变量访问修饰符
@interface MyClass : NSObject{
// 默认-受保护
// public, 类内类外都可以访问,并且可以继承
@public
int _classInt;
// 私有, 类内可以使用, 类外无法调用, 并且不可以被继承
@private
// 受保护, 类内可以使用, 类外无法调用, 并且可以继承
@protected
NSString* _classStr;
// 框架, - 在框架内相当于 protected, 在框架外相当于 private
@package
}
2. 关于类的继承
<pre name="code" class="objc">假设有一个MySubClass 继承My Class:
#import <Foundation/Foundation.h>
// NSObject - 基类
@interface MyClass : NSObject{
// 啥也不写, 默认受保护
int _classInt;
@private
NSString* _classStr;
}
@property(nonatomic, strong) NSString* className;
- (void)report;
@end
假设有一个MySubClass 继承My Class:
// 引用父类头文件
#import "MyClass.h"
// interface时冒号代表继承关系
@interface MySubClass : MyClass
- (void)show;
@end
举个例子:
1. 父类中的私有变量我们无法继承使用
2. 如果父类的方法中使用了私有变量, 而我们的子类继承了父类的这个方法,那私有变量的操作和访问我们是可以看到的,但是我们不可以在子类中直接调用私有变量
3. 如果父类的方法没有写声明,则子类无法继承父类中对应的方法(可以理解为找不到相应的接口)
- (void)show{
_classInt = 30;
// _classStr = @"MySubClassStr"; // 访问不了
NSLog(@"show - %d", _classInt);
}
3. 多态
多态的概念:简答的讲,就是假设有一个父类,多个子类继承这个父类,并且改写父类中的某个方法,这样就相当于每个子类有多种形态
方法重写:继承一个方法,实习方式不一样
方法重载(OC并不支持):相同函数名,但是不同的变量
例子:
假设我有一个父类叫printer
#import <Foundation/Foundation.h>
@interface Printer : NSObject
- (void)print;
@end
#import "Printer.h"
@interface ColorPrinter : Printer
@end
#import "Printer.h"
@interface Printer : Printer
@end
在子类的实现中,可以具体实现自己的print
// 方法重写
-(void)print{
//同时调用父类的print
[super print];
NSLog(@"彩色打印机");
}
同时,在子类中可以调用父类的 print, 用关键词super 代表父类
dynamic dispatch:
Printer* printer = [[ColorPrinter alloc] init];
[printer print];
新建了一个ColorPrinter 却把它赋给一个Printer指针,这里Printer 是static type, 而ColorPrinter 是dynamic type,编译器会找到对应的print, 并正确调用