A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© hughwang90 中级黑马   /  2014-4-7 08:51  /  1150 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 hughwang90 于 2014-4-7 19:33 编辑

这几天看到MJ老师的视频,讲到组合、继承、多态,组合和继承都详细的说了定义及使用场合,比如:xx是xx就用继承,xx拥有xx就用组合,但是多态呢?什么时候用多态,我知道多态的条件,什么是多态,就是不知道什么时候用多态。。。求指教啊~~~

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

3 个回复

倒序浏览
多态,子类指针可以赋值给父类,不同对象对同一消息的不同响应.
person.h
  1. @interface Person : NSObject
  2. @property (nonatomic,assign) NSString *name;
  3. -(void) show;
  4. @end
复制代码
person.m
  1. @implementation Person
  2. -(void)show{
  3.     NSLog(@"我是%@",self.name);
  4. }
  5. @end
复制代码

@interface Teacher : Person
@interface Student : Person
  1. #import <Foundation/Foundation.h>
  2. #import "Person.h"
  3. #import "Teacher.h"
  4. #import "Student.h"
  5. int main(int argc, const char * argv[])
  6. {

  7.     @autoreleasepool {
  8.         
  9.         Student *stu=[Student new];
  10.         stu.name=@"小明";
  11.         [stu show];
  12.         Teacher *tec=[Teacher new];
  13.         tec.name=@"王五";
  14.         [tec show];
  15.     }
  16.     return 0;
  17. }
复制代码
输出:
2014-04-07 09:45:55.800 多态[1669:303] 我是小明
2014-04-07 09:45:55.810 多态[1669:303] 我是王五




评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报
引用MJ的例子说明:

  1. void feed(Animal *a){
  2. [a eat];//eat方法在之前的Animal类中已经声明并实现
  3. }

  4. int main(){
  5.         Animal *a=[Cat new];//可以,Cat是Animal
  6.         Cat *c1=[Cat new];
  7.         //如果参数中是父类类型,则可以传入父类或子类类型
  8.         feed(a);
  9.         feed(c1);//这就是多态的好处,可以节省代码

  10.         //多态的限制:
  11.         Animal *a2=[Cat new];
  12.         [a2 run];//Cat有一个run跑的方法。程序在编译的时候会warning,因为父类不能调用子类的方法。运行没问题。
  13. }
复制代码




回复 使用道具 举报
动态类型:OC在运行时才确定对象的实际类型,如 id car,此时只有在执行到该语句时,我们才知道其实际类型
动态绑定:程序在执行时才确定对象调用的实际方法
在编译时就能确定的类型是静态类型,如 student *stu;这就是一个静态类型
id 类型属于ios常用的三大类型之一,其他包括:基本类型和对象类型,id类型可以代表任意的对象类型,该类型常用来实现多态

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马