创建: 2018/01/21

更新: 2018/01/22 标题前增加 [Objective-C]

完成: 2018/01/24

更新: 2018/01/24 加红加粗属性方法的声明 [不直接获取内部属性,获取用变量名,设定在变量名前加set]

更新: 2018/01/27 加红加粗类对象型Class, 首字母要大写

 动态结合(多态)
 动态结合 

呼出同一个方法,根据呼出方不同执行的处理也不同

//---------------------------------------------------------------------
// 类型定义
//---------------------------------------------------------------------
//动态结合与多态
@interface S4_A : NSObject { }
- (void)getLocationOfHierarchy;
- (void)getLocationOfHierarchy:(BOOL)isneedHello;
@end @interface S4_B : S4_A { }
- (void)getLocationOfHierarchy; //重载
- (void)getLocationOfHierarchy:(BOOL)isneedHello; //重载
@end //---------------------------------------------------------------------
// 类定义
//---------------------------------------------------------------------
//动态结合与多态
@implementation S4_A
- (void)getLocationOfHierarchy {
puts("this is A");
}
- (void)getLocationOfHierarchy:(BOOL)isneedHello {
if (isneedHello) {
puts("hello, this is A");
} else {
puts("need no hello, this is A");
} }
@end @implementation S4_B
- (void)getLocationOfHierarchy {
puts("this is B");
}
- (void)getLocationOfHierarchy:(BOOL)isneedHello {
if (isneedHello) {
puts("hello, this is B");
} else {
puts("need no hello, this is B");
}
}
@end //---------------------------------------------------------------------
// 测试函数
//---------------------------------------------------------------------
void S4Tester(void) {
puts("-----------------------------------------");
puts(" S4");
puts("-----------------------------------------");
id aTemp = [[S4_A alloc] init];
[aTemp getLocationOfHierarchy];
[aTemp getLocationOfHierarchy:NO];
[aTemp getLocationOfHierarchy:YES]; id bTemp = [[S4_B alloc] init];
[bTemp getLocationOfHierarchy];
[bTemp getLocationOfHierarchy:NO];
[bTemp getLocationOfHierarchy:YES]; }

运行结果

-----------------------------------------
S4
-----------------------------------------
this is A
need no hello, this is A
hello, this is A
this is B
need no hello, this is B
hello, this is B
Program ended with exit code: 0
 多态

多态就是动态结合

优点: 不用对每一个具体对象改变现有代码 p60

   
   
   
   
   
 数据类型与类 
 用型名来声明,定义

// 写法
类名 *变量名
//例
S4_A *a1, *a2, *a3;

是指针参照,改一个其他参照相同的都会改

 空指针nil

alloc把所有设为0,id和指针设为nil

nil  空的对象(Object) (id)0
NULL  空指针 (void *)0
Nil  (Class)0   (Void *)0
NSNull  [(NSNull)null]
   

向nil发送消息的返回值

返回id型  nil
返回指针   NULL
返回整数 0
其他

根据Max OS X版本,构造体大小等不同

具体不确定

   
 类型的静态确认

用明确的类去声明变量时,呼出该类不存在的东西时警告

●id型来声明的, 不会检查类型。呼出不存在的东西也不报错。

不能用->来获取变量

●id型和具体型可以互相代入

●实际运行时呼出的函数是实际包含在对象内的,而不是代码上看起来的

●id型不是(NSObject*), 和其他类没有继承关系

   
   
   
   
 编程的类型声明
 signature不同的情况

信息选择器带上返回值类型,参数类型的叫signature

//信息选择器
sample: sample_1;
//signatrue
- (int)sample:(int)a (id)sample_1:a;

signature由NSMethodSignature管理  # TODO: Supply [15-05 NSMethodSignature相关]

结论: 同一信息选择器应该设为同样的signature,也就是数据类型相同

 类的前置声明

可以代替#import来说明该字符串是类名

要带;

@class Sample;

只是说明这是个类,不能呼出内部的方法

重写  运算符的多重定义
 变形 

和c一样的写法

(型)变量;
//例子
int a = ;
(float) a = 1.1; id a;
(SampleObject) a;
   
   
   

 实例变量的封装 

 获取/设定都用方法

不直接获取内部属性,获取用变量名,设定在变量名前加set

@interface Sample {
int sampleVar;
}
- (int) samplevar; //获取sampleVar
- (void) setSampleVar:(int)var; //设定sampleVar
@end

修改内部实例变量

的接入权限

@private

@private // 只在当前类可以

@protected

@protected // 只在当前类内部
// 当前类的变量
// 子类内部可以获取

@public

@public //任何地方都可以获取内部变量

@package

@package //该类所在框架内部相当于@public
// 框架外如同@private
  @private

@protected

@interface内部默认

@public
 在类的定义内部(直接指定名字)
 该类的实例变量(->) ×
 子类 ×
 子类的实例变量(->) × ×
 任何地方 × ×

可以在@implementation内声明变量(默认@private)

@interface Sample : NSObject {
@public
int publicNum;
@protected
int protectedNum;
@private // 不指定的话默认都是这个
int privateNum;
}
- (void)test: (int)selector;
@end @implementation Sample {
int privateA; //@implementation部分声明的变量默认@private
@public
int publicA; //可以手动改变权限,和@interface部分写法一样
}
- (void)test: (int)selecter {
...
}
@end
   
   
   
   
   
 类对象 (class object) 
 类对象是什么

面向对象语言里把类也看做对象的语言(Obj-C, smalltalk), 不算做对象的(C++等)

Obj-C里有类方法(如alloc),没有类变量

 类对象的型

Class, 空的值是Nil

获取类的方法就是class

[SampleClass class]; // 获取类的class类型
Sample *a = [[Sample alloc] init];
[a class]; // 获取实例对象的class类型

判断是不是指定类的实例

[ctemp isMemberOfClass: [S4_C class]]

定义类方法

+ (返回值类型)方法选择器;

+ (int)getCount: (int *)array;

可以和实例方法及实例变量重名

注意:

●不能在类方法里呼出实例变量,实例方法

●self表示的是自己的类,呼出其他类方法直接对self发送

[self classMethod];

●呼出父类的类方法用super

[super classMethodFromSuperClass];
 类变量

●变量前加上static,因为static的量在其他文件处不可见

●把参照和设置函数设成类方法

 类的初始化

●类的初始化在该类第一次获取消息(收到函数)时自动发生

●NSObject的初始化方法initialize

●在初始化类对象时,父类的构造函数会自动呼出。不需要自己呼出父类的构造函数

static char *S4_Str = "还没初始化";
@interface S4_C : S4_B {
+ (void)initialize;
@end @implementation S4_C
+ (void)initialize {
S4_Str = "S4_C 已初始化";
puts(S4_Str);
}
@end

●只初始化类什么都不做,用self

self类方法定义在NSObject

[S4_C self]; // S4_C 已初始化
 构造函数返回值的类型

 都用id

●因为继承,如果不是id,受父类返回的类型

●在类内部呼出自己的类方法时候

[[Sample alloc] initWithParrern: ]; // 不这么写

[[[self class] alloc] initWithParrern: ]; //这么写

这样的话被继承了也可以在子类直接用

   

Objective-C 对象的类型与动态结合的更多相关文章

  1. IoC组件Unity再续~根据类型字符串动态生产对象

    回到目录 这个根据类型字符串动态去生产一个接口的对象,在实现项目中用途很广,这即省去了配置config文件的麻烦,又使用生产对象变更可配置,你完全可以把这种多态持久化到数据库里或者XML文件里,在使用 ...

  2. OC 动态类型,动态绑定,动态加载

    OC 动态类型,动态绑定,动态加载 Objective-C具有相当多的动态特性,基本的,也是经常被提到和用到的有 动态类型(Dynamic typing) 动态绑定(Dynamic binding) ...

  3. C# 中反射获取某类的子类和根据类型名动态创建对象

    有时候,为了快速批量处理已经实现某个基类或者某个接口的子类,需要通过反射的方式获取到他们的类类型(Type),然后再通过 1 Activator.CreateInstance(objType); 或者 ...

  4. 利用StringList对象来管理这些动态生成的对象

    如果程序需要动态创建大量的对象,那么我们可以利用StringList对象来管理这些动态生成的对象.1.创建StringList对象:OBJ := TStringList.Create; 2.保存动态生 ...

  5. 六.OC基础--1. id和instancetype类型,2.动态类型检测,3.响应方法,构造方法,4.重写构造方法,5.自定义构造方法

    1. id和instancetype类型, id和instancetype类型区别: 1. id和instancetype都可以用来作为方法的返回值 2. id可以用来定义类型,instancetyp ...

  6. Java基础 ----- 判断对象的类型

    1. 判断对象的类型:instanceOf 和 isInstance 或者直接将对象强转给任意一个类型,如果转换成功,则可以确定,如果不成功,在异常提示中可以确定类型 public static vo ...

  7. Python中对象、类型、元类之间的关系

    Python里的对象.类型和元类的关系很微妙也很有意思. 1989年圣诞节期间,上帝很无聊,于是创造了一个世界. 对象 在这个世界的运转有几条定律. 1.一切都是对象 对象(object)是这个世界的 ...

  8. C++11用于计算函数对象返回类型的统一方法

    [C++11用于计算函数对象返回类型的统一方法] 模板 std::result_of 被TR1 引进且被 C++11 所采纳,可允许我们决定和使用一个仿函数其回返值的类别.底下,CalculusVer ...

  9. Ⅴ.spring的点点滴滴--引用其他对象或类型的成员

    承接上文 引用其他对象或类型的成员 .net篇(环境为vs2012+Spring.Core.dll v1.31) public class Person { public string Name { ...

随机推荐

  1. POJ-1679 The Unique MST,次小生成树模板题

    The Unique MST Time Limit: 1000MS   Memory Limit: 10000K       Description Given a connected undirec ...

  2. oracle10g_v$sqltext之对等视图v$sqltext_with_newlines

    --v$sqltext_with_newlines是v$sqltext等同体,较之易读性强(由sql_address及sql_hash_value唯一确认一个cached cursor中的sql)SQ ...

  3. [luoguP1972] [SDOI2009]HH的项链(莫队 || 树状数组 || 主席树)

    传送门 莫队基础题,适合我这种初学者. 莫队是离线算法,通常不带修改,时间复杂度为 O(n√n) 我们要先保证通过 [ l , r ] 求得 [ l , r + 1 ] , [ l , r - 1 ] ...

  4. hdu 4091 数学思维题贪心

    /* 参看博客地址:http://blog.csdn.net/oceanlight/article/details/7857713 重点是取完最优的后剩余的rest=n%lcm+lcm;中性价比小的数 ...

  5. bzoj1052 [HAOI2007]覆盖问题 - 贪心

    Description 某人在山上种了N棵小树苗.冬天来了,温度急速下降,小树苗脆弱得不堪一击,于是树主人想用一些塑料薄膜把这些小树遮盖起来,经过一番长久的思考,他决定用3个L*L的正方形塑料薄膜将小 ...

  6. [K/3Cloud] 创建一个业务单据表单插件

    概念 创建一个业务单据插件,处理单据的相关控制逻辑. 示例 新建一个类,继承自单据插件基类Kingdee.BOS.Core.Bill.PlugIn.AbstractBillPlugIn. using ...

  7. 子集和的目标值(codevs 1692)

    题目描述 Description 给定n个整数in和目标值T,求某一非空子集使 子集的元素的和 与 目标值之差 的绝对值最小,元素可重复 输入描述 Input Description 第一行为整数n ...

  8. 【JZOJ4857】Tourist Attractions(Bitset)

    题意:给定一个n个点的无向图,求这个图中有多少条长度为4的简单路径. n<=1500 思路: #include<map> #include<set> #include&l ...

  9. zoj2479 Cover the Rectangular Ground

    肯定是dfs搜一下的,但是呢存在一个很大的剪枝,也就是面积必定要是相等的,那么如何去操作呢,可以想到的是二进制枚举选取的方法,然后把方法中选取的矩形面积求和并判断一下即可,然后dfs搜索,要注意的是, ...

  10. Bad Hair Day-POJ3250(简单的入栈出栈)

    Description Some of Farmer John's N cows (1 ≤ N ≤ 80,000) are having a bad hair day! Since each cow ...