IOS-OC-继承和class类型

继承

【继承】
【注】这里说的继承,指集合的包含关系,即父类和子类的关系

一.认识继承
(一)从生活逻辑的角度
父类 生物 外星人
子类 动物 变形金刚
父类 动物 变形金刚
子类 人类 汽车人

类 人类 汽车人
对象 我 大黄蜂
//
【注】父子类的各种称呼
父类 parentClass 超类 supperClass 基类
子类 childClass 子类 subClass

派生类

【注】【继承】也可被称作【派生】。父类拥有的属性和方法,子类直接获得,这个过程叫做继承。子类在父类基础上,衍生出了自己独有的属性和方法,称为派生。继承(关注子父类相同的部分)和派生(关注子父类不同的部分)是描述同一事物的两种侧重。

(二)从编写代码的角度
【见继承Demo】

@interface Father : NSObject
{
int a;
int b;
int c;
}

@property NSString * name;

  • (void)run;
  • (void)jump;

@end

@interface Son : Father
//通过:建立继承关系 继承到父类的字段,属性和消息
字段 类似于 int a,b;这种
属性 类似于@property NSInter score
消息 就是我们所说的 方法

//但是子类无法继承到父类未声明的方法

//子类也可以派生出自己独有的字段,属性和消息
{
int d;
}

@property NSString * ID;

  • (void)swim;

@end

【重写】有时候从父类继承到的方法,并 不适合子类,子类 可以重写这个方法。
【注】很多时候,子类的方法只需要在父类的同名方法中增补些内容。可以通过关键字【supper】调用父类的方法,再增添子类独有的内容。

//重写父类的jump方法,重写方法,不用声明
//重写的方法会覆盖掉父类的方法

  • (void)jump
    {
    NSLog(@"I can jump 1.8m!");
    }

//很多时候,重写父类的方法,只是在父类的功能上添枝加叶。(既要用父类的东西 也要用自己的东西);

  • (void)showSelf
    {
    //先调用父类的showSelf,再加上自己的功能
    [super showSelf];//super 调用父类的东西
    //如果[super showSelf] 不写 会覆盖父类的方法
    //只有当[super showSelf]和NSLog(@"%@", self.ID);写好了才会既有父类的内容也有子类的内容实现
    NSLog(@"%@", self.ID);
    // 调用自己(子类的东西)注意 super 和self 指向的地址都相同//指向同一块内存;
    }

(三)从内存结构的角度

【问】为什么OC不能sizeof一个对象的大小或一个类的大小?和类结构相近的结构体却可以。
【再问】为什么OC不能将对象声明到静态空间,如栈中?和类结构相近的结构体却可以。

【答】因为OC的动态继承编译机制。所谓动态继承机制,就是说在编译时,不能确立类之间的继承关系,自然无法确定类的大小。只有运行时,才确立类之间的继承关系。不能在编译时确定类的大小,自然不能将类的对象创建在栈里。

二.继承的作用
编写面向对象的程序,核心的手法有三:
继承 封装 多态

(一)创建大量相似的类
【例】创建象棋中的棋子,车马士象炮。
可以先创建棋子类,作为父类。

// 练习
1.用尽量简单的方式,创建下述类
公共汽车类
属性:速度,车长,车宽,车高,最大载人,吊环数
方法:
启动
加速
减速
刹车
停车
报站

卡车类
属性:速度,车长,车宽,车高,最大载人,最大载重
方法:
启动
加速
减速
刹车
停车
翻斗

2.假设我想给上述两辆车,添加属性,颜色。怎么做最方法便?

作业:

  1. 创建一个学生类,属性有学号,姓名,手机号,按照某个属性的顺序 使用NSLog打印出,学生的详情

  2. 使用SEL 创建一个类计算 加减乘除

  3. isMemberOfClass isKindOfClass respondsToSelector instancesRespondToSelector 方法的使用

  4. 为数组添加方法,返回数组中字符串的个数。(数组中除了字符串可能还有别的对象)

#import <Foundation/Foundation.h>
#import "Dog.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Dog *dog = [[Dog alloc] init];
        // 首先查找自己有没有这个方法,如果没有查找父类,如果父类也没有,查找父父类,直到查找到最终的类,如果其中一个类有这个方法,就不会继续查找
        [dog run];
        [dog eat];
        
        
    }
    return 0;
}

#import <Foundation/Foundation.h>

@interface Animal : NSObject
{
    int _age;
}
- (void)run;
- (void)eat;
@end
#import "Animal.h"

@implementation Animal
- (void)run
{
    NSLog(@"吃饱了,跑了");
}

- (void)eat
{
    NSLog(@"跑累了,过来吃");
}
@end
#import "Animal.h"

@interface Dog : Animal
{
    int _weight;
}
@end
#import "Dog.h"

@implementation Dog
// 方法重写
- (void)run
{
    _age = 10;
    _weight = 200;
    NSLog(@"重写了跑的方法");
}
@end
#import "Animal.h"

@interface Cat : Animal

@end
#import "Cat.h"

@implementation Cat

@end

继承案列1

#import <Foundation/Foundation.h>
#import "XiaoMing.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        XiaoMing *xiaoM = [[XiaoMing alloc] init];
        [xiaoM run];
        
        
    }
    return 0;
}
#import <Foundation/Foundation.h>

@interface Human : NSObject

// 年龄
@property NSInteger age;

// 名字
@property NSString *name;

// 体重
@property float weight;

// 身高
@property float height;

// 睡
- (void)sleepHuman;
// 跑
- (void)run;
// 吃
- (void)eat;
@end
#import "Human.h"

@implementation Human
- (void)cry
{
    NSLog(@"----%@",self);
    NSLog(@"隔壁老王,哭了");
}

- (void)run
{
    [self cry];
}

@end
#import "Human.h"

@interface XiaoMing : Human
// 分数
@property NSInteger score;
// 交朋友
- (void)makeGirlFriends;
@end
#import "XiaoMing.h"

@implementation XiaoMing
- (void)run
{
    [super run];
    NSLog(@"隔壁老李笑了");
}
@end

继承案列2

    <1>. 设计对象:学生,老师
                学生:    成员: 名字,年龄,  地址
                           方法: 吃饭,玩,学习,听课

                老师:    成员: 名字,年龄,  地址
                           方法: 吃饭,玩,学习,讲课
#import <Foundation/Foundation.h>

@interface Person : NSObject

//名字,
@property NSString *name;

//年龄,
@property NSInteger age;

//地址
@property NSString *address;

//吃饭,
- (void)eat;

//玩,
- (void)play;

//学习
- (void)study;
@end
#import "Person.h"

@implementation Person

@end
#import "Person.h"

@interface Student : Person
// 听课
- (void)listen;
@end
#import "Student.h"

@implementation Student
- (void)listen
{
    
}
@end

#import "Person.h"

@interface Teacher : Person
// 讲课
- (void)teach;
@end
#import "Teacher.h"

@implementation Teacher
- (void)teach
{
    
}
@end

Class
【注】Class也是类型,装类的类型。

Class cls = [Dog class];
//NSObject自带类方法class,将当前类转成Class类型。

Class cls = [Dog class];
id dog = [[cls alloc] init];
//Class变量,也能创建对象。

BOOL ret = [dog isKindOfClass:[Dog class]];
//判断一个对象是否属于一个类

Class cls2 = NSClassFromString(@"Dog");
//Class变量也可以在运行时(runtime)赋值。

// Class一些方法的使用

isMemberOfClass //判断这个类是不是这个类;
isKindOfClass //判断一个是不是一个类的子类

# Class类型

import <Foundation/Foundation.h>

import "Dog.h"

import "Person.h"

int main(int argc, const char * argv[]) {
@autoreleasepool {
// 获取一个类的类型
Class class = [Dog class];

    // 通过类的类型实例化的对象是id类型
    id dog = [[class alloc] init];
    [dog runing];
    
    // 强转换
    Dog *d = (Dog *)dog;
    [d runing];
    
    // 字符串和类的类型的转换
    Class classTwo = NSClassFromString(@"Dog");
    Dog *dogTwo = [[classTwo alloc] init];
    [dogTwo runing];
    
    
    // 获取人对象
    Person *person = [[Person alloc] init];
    // 第一种方法
    [person feedAnimal:@"Cat"];
    // 第二种方法
    [person feedAnimalWithClass:[Dog class]];
    // 第三种
    Dog *dogT = [[Dog alloc] init];
    [person feedAnimalWithId:dogT];
    
}
return 0;

}

import <Foundation/Foundation.h>

@interface Dog : NSObject

  • (void)runing;
    @end

import "Dog.h"

@implementation Dog

  • (void)runing
    {
    NSLog(@"你基友跟他女朋友跑了");
    }
    @end

import <Foundation/Foundation.h>

@interface Cat : NSObject

@end

import "Cat.h"

@implementation Cat

@end

import <Foundation/Foundation.h>

@interface Person : NSObject

  • (void)feedAnimal:(NSString *)animal;
  • (void)feedAnimalWithClass:(Class )animal;
  • (void)feedAnimalWithId:(id)animal;
    @end

import "Person.h"

import "Cat.h"

import "Dog.h"

@implementation Person

  • (void)feedAnimal:(NSString *)animal
    { //把字符串animal转换成Class类型
    Class class = NSClassFromString(animal);

    // 创建对象//注意class 是Class的变量
    id ani = [[class alloc] init];

if ([ani isKindOfClass:[Cat class]]) {
    NSLog(@"猫在喂人");
}else
{
    NSLog(@"人在喂狗");
}

}

  • (void)feedAnimalWithClass:(Class)animal

{
id ani = [[animal alloc] init];
// 直接强转成Dog类型的对象
// Dog *ani = [[animal alloc] init];
if ([ani isKindOfClass:[Cat class]]) {
NSLog(@"猫在喂人");
}else
{
NSLog(@"人在喂狗");
}

}

  • (void)feedAnimalWithId:(id)animal
    {
    if ([animal isKindOfClass:[Cat class]]) {
    NSLog(@"猫在喂人");
    }else
    {
    NSLog(@"人在喂狗");
    }
    }

@end

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,324评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,356评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,328评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,147评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,160评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,115评论 1 296
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,025评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,867评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,307评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,528评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,688评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,409评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,001评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,657评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,811评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,685评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,573评论 2 353

推荐阅读更多精彩内容