Objective-C----继承

一、概念:

面向对象提供了继承语法,能大大简化代码。把公共的方法和实例变量写在父类里,子类字需要写自己独有的实例变量和方法即可。

继承既能保证类的完整,又能简化代码。

二、继承的特点:

OC 中只允许单继承。

没有父类的类成为根类,OC中的根类是NSObject(祖宗)。

继承的内容:所有实例变量和方法。

如果子类不满意父类方法的实现,可以重写(overwrite)父类的方法。

三、方法调度机制:

当代码发送消息时,Objective-C的方法调度机制将在当前的类中搜索相应的方法。如果无法在接收消息的对象的类文件中找到相应的方法,它就会在该对象的超类中进行查找。

每个方法调用都获得了一个名为 self 的隐藏参数,它是一个指向接收消息的对象的指针。这些方法通过 self 参数来寻找它们需要用到的实例变量。

super ,既不是参数也不是实例变量,而是由 Objective-C 向该类的超类发送消息。如果超类中没有定义改消息,Objective-C会和平常一样继续在继承链上一级中查找。一直查找到根类。

四、什么情况下用复合?什么情况下用继承?

继承的类之间建立的关系为“is a”(是一个)。三角形是一个形状,V6 是一个发动机,米其林 是一种轮胎的名字。如果可以说“X 是一个 Y”,那就可以使用继承。

另一方面,复合的类之间建立的关系为“has a”(有一个)。形状有一个填充颜色,汽车有一个发动机和四个轮胎。与继承不同,汽车不是一个发动机,也不是一个轮胎。如果可以说“X 有一个 Y”,那么就可以使用复合。

五、直接上例代码

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

int main(int argc, const char * argv[]) {

    // 一个类可以拥有多个子类,一个类只能拥有一个直接父类(单继承的概念),但是可以拥有多个超类。

    Student *student = [[Student alloc] initWithName:@"wang" gender:@"nv" age:31] ;
    [student eat] ;
    [student sleep] ;

    Student *otherStudent = [[Student alloc] initWithName:@"zhen" gender:@"nan" age:12 number:11011 schoolName:@"hafu"] ;
    [otherStudent study] ;

    return 0;
}

Student.h 文件:

//
//  Student.h
//
//  Created by  on 15/4/1.
//  Copyright (c) 2015年 . All rights reserved.
//

#import "Person.h"

// 定义子类是在父类继承而来的特征(实例变量)和行为(方法)的基础上定义自己特有的特征和行为
@interface Student : Person
{
    int       _number ;
    NSString *_schoolName ;
}

- (void)setNumber: (int)number ;
- (void)setShoolName: (NSString *)schoolName ;

- (int)number ;
- (NSString *)schoolName ;

- (instancetype)initWithName:(NSString *)name
                      gender:(NSString *)gender
                         age:(int)age
                      number:(int)number
                  schoolName:(NSString *)schoolName ;

- (void)study ;

@end // Student : Person

Student.m 文件:

//
//  Student.m
//
//  Created by  on 15/4/1.
//  Copyright (c) 2015年 . All rights reserved.
//

#import "Student.h"

@implementation Student

- (void)setNumber:(int)number {
    _number = number ;
} // setNumber

- (void)setShoolName:(NSString *)schoolName {
    _schoolName = schoolName ;
} // setSchoolName

- (int)number {
    return _number ;
} // number

- (NSString *)schoolName {
    return _schoolName ;
} // schoolName

- (instancetype)initWithName:(NSString *)name
                      gender:(NSString *)gender
                         age:(int)age
                      number:(int)number
                  schoolName:(NSString *)schoolName {
    if ( self = [super initWithName:name
                             gender:gender
                                age:age] ) {
        _number = number ;
        _schoolName = schoolName ;
    }
    return self ;
} // initWithName

- (void)study {
    NSLog( @"%@在%@学校学习,学号:%d!",
          _name, _schoolName, _number ) ;
} // study

- (void)eat {
    [super eat] ;
    NSLog( @"喝西北风" ) ;
} // eat

@end // Student : Person

Person.h 文件:

//
//  Person.h
//
//  Created by  on 15/4/1.
//  Copyright (c) 2015年 . All rights reserved.
//

#import <Foundation/Foundation.h>

@interface Person : NSObject
{
    NSString *_name ;
    NSString *_gender ;
    int       _age ;
}

//setter设置器
- (void)setName: (NSString *)name ;
- (void)setGender: (NSString *)gender ;
- (void)setAge: (int)age ;

//getter访问器
- (NSString *)name ;
- (NSString *)gender ;
- (int)age ;

// 初始化
- (instancetype)initWithName: (NSString *)name
                      gender: (NSString *)gender
                         age: (int)age ;

- (void)eat ; // 吃
- (void)sleep ; // 睡

@end  //  Person

Person.m 文件:

//
//  Person.m
//
//  Created by  on 15/4/1.
//  Copyright (c) 2015年 . All rights reserved.
//

#import "Person.h"

@implementation Person

- (void)setName:(NSString *)name {
    _name = name ;
} // setName

- (void)setGender:(NSString *)gender {
    _gender = gender ;
} // setGender

- (void)setAge:(int)age {
    _age = age ;
} // setAge

- (NSString *)name {
    return  _name ;
} // getName

- (NSString *)gender {
    return _gender ;
} // getGender

- (int)age {
    return _age ;
} // getAge

- (instancetype)initWithName:(NSString *)name
                      gender:(NSString *)gender
                         age:(int)age {
    if ( self = [super init] ) {
        _name = name ;
        _gender = gender ;
        _age = age ;
    }
    return self ;
} // initWithName

- (void)eat {
    NSLog( @"%@在餐厅吃饭!", _name ) ;
} // eat

- (void)sleep {
    NSLog( @"%@在睡觉!", _name ) ;
} // sleep

@end  //  Person

时间: 2024-10-19 06:09:31

Objective-C----继承的相关文章

objective C中继承、协议、分类和多态的实现

第一.objective C中继承的实现 在oc中只有实例变量会有权限控制,实例方法和类方法是没有权限控制的,这点与c++不同,OC默认的是protected,并且在声明权限控制时,没有分号 在OC中可以像C++一样用指针运算法来访问实例变量 Rectangle.h 文件代码: #import <Foundation/Foundation.h> @interface Rectangle : NSObject { int _width; int _height; } @property (non

OC中protocol、category和继承的区别

利用继承,多态是一个很好的保持"对扩展开放.对更改封闭"(OCP)的办法,也是最常见的一种方法.Objective C还支持另外两种语法来支持OCP:Protocol和Category.Protocol只能定义一套接口,而不能提供实现,变相的也是一种Abstract class的实现方式(oc 语法上本身不支持抽象基类).Category可以为类提供额外的接口和实现.那么到底三者(继承, Protocol,Category)在使用上到底有什么本质的区别呢?在我看来,protocol的作

C++ vs Objective C

oc Short list of some of the major differences: C++ allows multiple inheritance, Objective-C doesn't.一个允许多继承,一个不允许Unlike C++, Objective-C allows method parameters to be named and the method signature includes only the names and types of the parameter

objective - c 类和对象

知识点 1.初步认识 OC 2.xcode使用 3.面向对象编程思想,类和对象 4.类的定义和使用 5.类的实例化--对象 6.声明和实现相分离 =========================================== 1.需要理解的(理论部分) 第一部分:OC和面向对象 1.1.OC语言的历史,特点.重要程度 [什么是OC] objective - c   在C语言基础上开发, 面向对象的语言: 注意C语言和oc语言语法的区别: IOS, iphone, ipad … [进入OC

四.OC基础--1.文档安装和方法重载,2.self和super&amp;static,3.继承和派生,4.实例变量修饰符 ,5.私有变量&amp;私有方法,6.description方法

四.OC基础--1.文档安装和方法重载, 1. 在线安装 xcode-> 系统偏好设置->DownLoads->Doucument->下载 2. 离线安装 百度xcode文档 3. 方法重载: 是指在一个类中定义多个同名的方法 在OC中没有重载 2.self和super&static, self和super: 1. self理解: 谁调用当前方法, self就代表谁. 比如: 在对象方法中,self代表的是对象, 因为只有对象才可以调用对象方法 在类方法中, self代表的

Objective-C----MRC内存管理 、 自动释放池 、 面向对象三大特性及封装 、 继承 、 组合与聚合

1 MRC练习 1.1 问题 引用计数是Objective-C语言采用的一种内存管理技术,当一个对象被创建在堆上后,该对象的引用计数就自动设置为1,如果在其它对象中的对象成员需要持有这个对象时,则该对象的引用计数被加上1,此时如果该对象被释放,内存管理程序将首先把该对象的引用计数减1,然后判断该对象的引用计数是否为0,由于其它对象在持有该对象时将引用计数加了1,所以此时该对象的引用计数减1后不为0,则内存管理程序将不会释放该对象.直到持有该对象的其它对象也被释放时,该对象的引用计数再次减1,变为

Objective-C 源码(一):对象模型

首先,你要先弄清楚什么是类,什么是对象.(为了说清楚这个问题,先举个栗子:类->对象->实例:人类是类:某个人是对象:你是实例:实例本身也是对象.这下基本能理解其中的差别了,要是还是搞不清楚,自己去google一下吧.) 对象 在Objective-C中,每一个对象都是某个类的实例,且这个对象的isa指针指向它所属的类.打开 objc-private.h文件,在第126行可以看到 Objective-C???? 对象的定义struct objc_object ,Objective-C中对象本质

iOS完全自学手册——[三]Objective-C语言速成,利用Objective-C创建自己的对象

1.前言 上一篇已经介绍了App Delegate.View Controller的基本概念,除此之外,分别利用storyboard和纯代码创建了第一个Xcode的工程,并对不同方式搭建项目进行了比较.这一篇文章,我准备为大家介绍一下奇葩的Objective-C语言的语法和使用.这篇文章主要讲Objective-C的理论概念. 2.学习目标 2.1 Objective-C语言面向对象的特性与其他语言(C++)类比学习,声明定义一个MyObject类,并创建这个类的实例. 2.2 Objectiv

编写高质量代码-OC 第6章 继承与面向对象设计

41.明确isa在继承上的作用 1.在Objective-C中,每个对象都隐藏着一个数据结构isa指针 2.isa指针指向的是对象的类,这个类也是一个对象,有自己的权. 3.在Objective—C中,每个对象还都保留一个超类的指针,通过该指针可调度自己已有的方法和调度基类. 42.利用类别和协议实现类似多重继承的机制 1.类别,实现了类的相关方法的模块化,把不同的类方法分配到不同的分列文件中. 2.类别可以重载原始类的方法,但不推荐这么做,这么做得后果是再也不呢过访问原来的方法,如果确实要重载

iOS开发——技术精华Swift篇&amp;Swift 2.0和Objective-C2.0混编之第三方框架的使用

Swift 2.0和Objective-C2.0混编之第三方框架的使用 swift 语言是苹果公司在2014年的WWDC大会上发布的全新的编程语言.Swift语言继承了C语言以及Objective-C的特性,且克服了C语言的兼容性问题.Swift语言采用安全编程模式,且引入了多种新功能,使得编程工作更加简便,灵活! 2015年6月9日苹果又一次给所有开发之者带来了一个惊喜,那就是今年年底swift讲开源,者队iOS开发着来说无疑是一个值得兴奋的消息,可是就在这短短的几个月里面swift吸引了越来