Objective-C基础1:OC中类的继承和组合

1.类的定义和声明

OC中的类声明是以@interface开始@end结束。

OC中的类定义以@implementation开始@end结束。

OC中的方法声明:

- (void) setName : (NSString*) strName;前面的短线-表示这是一个方法,(void)表示返回值, setName表示方法名称,(NSString*) StrName表示参数是NSString*类型,名称是strName,注意:()一定要加

OC中的成员变量定义在类声明的{}中,这一点跟方法声明不一样,方法在{}外

OC中的对象创建方法:Animal* animal = [Animal new]; 表明对Animal类调用new方法分配一块内存创建对象。

OC中的方法调用:[animal setName : @"akon"];表明调用对象animal方法setName,传入参数为akon。

需要注意的是:OC中的方法调用都是以中括号[]括起来的。

编程好习惯:类名以大写字母开头,方法名和变量名字以小写字母开头。

例子:

///声明
@interface Animal : NSObject
{
@private
NSString* strName;
}
- (void) setName : (NSString*) strName;
- (NSString*) getName;

@end

//定义
@implementation Animal

- (void) setName : (NSString*) strNameIn
{
    strName = strNameIn;
}

- (NSString*) getName
{
    return strName;
}

@end

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

    Animal* animal = [Animal new];
    [animal setName : @"akon"];
    NSString* strName = [animal getName];
    NSLog(@"name:%@", strName);
    return 0;
}

2.类的继承

其实上面例子中的Animal就演示了类的继承Animal类继承于NSObject,为了加深印象,分别创建两个类Cat和Dog继承于父类Animal,代码如下:

@interface Animal : NSObject
{
@private
NSString* strName;
}
- (void) setName : (NSString*) strName;
- (NSString*) getName;
- (NSString*) manCallMe;

@end

@interface Cat : Animal

@end

@interface Dog : Animal

@end

#endif

上述Animal类定义了一个方法manCallMe,定义这个方法的意图是为了实现类似C++里面的虚函数,C++里面是通过虚函数来实现动态绑定的。

那么OC是如何实现动态绑定的呢?只要子类覆盖父类的方法即可。代码见下:

//
//  Animal.m
//  TestCons
//
//  Created by mac on 15/1/17.
//  Copyright (c) 2015年 akon. All rights reserved.
//

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

@implementation Animal

- (void) setName : (NSString*) strNameIn
{
    strName = strNameIn;
}

- (NSString*) getName
{
    return strName;
}

- (NSString*) manCallMe
{
    return @"Animal";
}

@end

@implementation Cat

- (NSString*) manCallMe
{
    return @"Cat";
}

@end

@implementation Dog

- (NSString*) manCallMe
{
    return @"Dog";
}
@end

在创建对象的时候,以id类型保存对象指针,代码如下:

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

    id animal[3];
    animal[0] = [Animal new];
    [animal[0] setName : @"a"];
    animal[1] = [Cat new];
    [animal[1] setName : @"b"];
    animal[2] = [Dog new];
    [animal[2] setName : @"c"];
    for (int i = 0; i < 3; ++i) {
        NSLog(@"getName:%@, manCallMe:%@", [animal[i] getName], [animal[i] manCallMe]);
    }
    return 0;
}

有的时候子类需要调用父类的方法,如何做,类似于C++__super关键字,OC中有有super关键字,比如在Cat中调用Animal的manCallMe方法,这样干:

[super manCallMe]

3.类的组合

继承跟组合是复用类的两种方法,那么什么时候用继承什么时候用组合呢?继承强调的是"是一种"关系,比如猫是动物的一种,够是动物的一种。那么猫和狗就应该继承于动物。组合强调的是‘‘有‘‘的关系,比如动物有腿,有眼睛,那类动物就应该组合腿和眼睛。

组合的实现很简单,就是简单地把方法调用委托给被组合类。比如动物类有个方法‘"放电",那么这个方法的实现就可以调用眼睛的放电方法来实现。由于很简单,代码就不上了。

时间: 2024-10-10 08:47:45

Objective-C基础1:OC中类的继承和组合的相关文章

[Objective-c 基础 - 2.3] 继承、组合

A.继承的实现: is a 1.不允许子类.父类存在相同的成员变量 2.方法调用优先原则:子类调用方法的时候,优先从本类寻找,若无则向上在父类中寻找 3.重写:子类重新实现父类的方法,覆盖父类之前的方法 4.无论对象方法或类方法都可以重写 5.缺点:致使耦合性增强 6.OC只能单继承 B.组合的实现: has 1.不使用继承,而是将某个类作为成员变量,就可以使用其成员变量和方法 C.super关键字 对象方法和类方法都可以使用super调用父类的方法 1 #import <Foundation/

【《Objective-C基础教程 》笔记ch04】(五)OC中的继承inheritance机制

一.为什么需要继承 使用继承一方面继承了父类的特性,另一方便解决了重复代码维护问题. 二.继承之语法 1. @interface 子类名:父类名 2. OC只支持单继承,不支持继承多个父类. 3. 重构--移植和优化代码. 三. 继承的工作机制 1. 方法调度 子类拥有一个指向它父类的引用指针,消息传递时,OC的方法调度机制使用该信息来找到正确的实现方法,查找过程是现在子类中找,找不到再到父类中继续找. 2. 实例变量 1)继承实例源码 @interface Shape : NSObject {

OC基础--OC中类的定义

OC中类的定义与使用跟C#和java差别相当明显,做个笔记,牢记并加以区别! 一.OC中类的定义:关键字@implementation 和 @end 注意事项: 1.定义好一个类之后,要让这个类继承NSObject这个类--是为了让自己定义的类能够具备创造对象的能力 2.继承NSObject后还不算完,NSObject的声明在Foundation框架中,所以--#import <Foundation/Foundation.h> 3.OC中定义的类中,类的属性和方法是分开写的--类的属性定义在“

iOS开发OC基础:OC基础概念总结,OC面向对象的思想

一.什么是OOP: OOP(Object Oriented Programming):面向对象编程 二.面向对象和面向过程的区别: 面向过程编程:分析解决问题的步骤,实现函数,依次使用面向对象编程:分解问题组成的对象,协调对象间的联系和通信,解决问题. 面向过程是以事件为中心,关心的是完成这个事件的详细步骤:面向对象是以事物为中心,关心的是事物应该具备的功能,而完成一个事件只是事物所有功能里面的一个小功能(以过程为中心,以对象为中心) 三.类和对象 对象定义了解决问题的步骤中的行为,不刻意完成一

OC语言---封装,继承,多态

/* 面向对象程序设计中的类有三大特性:继承,封装,多态,这是OC中类的三大特性. 1.封装: 封装是对象和类概念的主要特性.它是隐藏内部实现,稳定外口 可以看作是“包装”. 封装,也就是把客观事物封装成抽象的类 并且类可以把自己的数据和方法只让可信的类或者对象操作,对不 可信的进行信息隐藏. 好处:使用更加简单  变量更加安全 可以隐藏内部实现细节  开发速度加快 OC中一个类可以继承另一个类,被继承的类成为超类(super class),继承的类是子类(child class),可以直接拥有

黑马程序员------OC面向对象之继承

------Android培训.iOS培训.Java培训,期待与您交流----- 一.继承的基本概念 继承是面向的三大特征之一,指的是在一个类的基础上,定义一个新类:原本的类成为父类(基类),新类称为子类(派生类). 生活中,继承的例子也是数不胜数,比如一个儿子继承了他父亲,那么他就享受他父亲的财产了,当然不是全部,详细解释见下文. 再如,一个电器系列: 一层接着一层,电器为父类,下面的洗衣机.电脑.电视机都是电器的子类,下面的品牌名又是洗衣机.电脑.电视机的子类,当然也是电器的子类. 体现在代

iOS开发OC基础:OC属性的一些概念和基本使用

一.属性简介 //属性是OC2.0之后新出的一种语法,能让我们快速的生成setter以及getter方法,大大简化代码 二.如何定义一个属性 //@property 属性关键字,用来定义属性 //NSString * 属性的类型 //name 属性的名字. //@property 只是生成的setter以及getter方法的声明.@property NSString *name; 三.属性的使用注意事项//如果在.m文件中我们自己实现了setter以及getter方法,则编译器就不会再帮我们生成

iOS开发OC基础:OC的内存管理

OC内存管理的基础知识 /** //             *  当对一个对象autorelease时,会将该对象放到离它最近的自动释放池,当自动释放池将要销毁时,会对自动释放池中的对象发送release消息,让对象的引用计数减1,(切记,是将对象的引用计数减1,而不是回收空间.) //             */ /** *  如果相对一个对象做copy操作,就必须让该类服从NSCopying协议,并且实现协议中的- (id)copyWithZone:(NSZone *)zone方法 */

iOS开发OC基础:OC中的分类(类目)

//分类,category,(类目) //为没有源代码的类添加方法 //一定要注意,只能添加方法,不能添加实例变量 /** *  分类 类的定义也是分为接口部分和实现部分 接口部分:以@interface开头 + 类名 后跟小括号,小括号内填写的是分类名 @end结束 在@interface 与@end 之间添加方法. */ //分类为原类添加的方法,就相当于原类具有该方法,可以正常调用 因为涉及到几个分类的创建,所以就直接上传代码了,其实代码也不多,只是怕大家在建立分类的时候会混淆,所以直接把