[Objective-C] 004_继承封装与多态

继承

  面向对象编程 (OOP) 语言的一个主要功能就是"继承"。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。通过继承创建的新类称为"子类"或"派生类",被继承的类称为"基类"、"父类"或"超类"。继承的过程,就是从一般到特殊的过程。在考虑使用继承时,有一点需要注意,那就是两个类之间的关系应该是"属于"关系。例如,Teacher 是一个人,Student 也是一个人,因此这两个类都可以继承 Person 类。但是 Leg 类却不能继承 Person 类,因为腿并不是一个人。

Person类

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

@interface Person : NSObject

@property (nonatomic,copy)NSString *name;
@property (nonatomic,assign)int age;
@property (nonatomic,assign)NSString *sex;

- (void)printInfo;
@end

/////////////////    .m    ////////////////
#import "Person.h"

@implementation Person
@synthesize name = _name,sex = _sex;
@synthesize age = _age;

- (void)printInfo {
    NSLog(@"我的名字叫:%@ 今年%d岁 我是一名%@ %@",self.name,self.age,self.sex,NSStringFromClass([self class]));
}
@end

  

  

Teacher 类

/////////////    .h   ////////////
#import "Person.h"

@interface Teacher : Person

@end

/////////////    .m   ////////////
#import "Teacher.h"

@implementation Teacher

- (void)printInfo {
    NSLog(@"我的名字叫:%@ 今年%d岁 我是一名%@ %@",self.name,self.age,self.sex,NSStringFromClass([self class]));
}
@end

  

封装
  封装是对象和类概念的主要特性。它是隐藏内部实现,稳定外部接口,可以看作是"包装"。 封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。

Student 类

////////////////    .h    ///////////
#import "Person.h"

@interface Student : Person

- (id)initWithName:(NSString *)name sex:(NSString *)sex age:(int)age;
@end

////////////////    .m    ///////////
#import "Student.h"

@implementation Student

- (id)initWithName:(NSString *)name sex:(NSString *)sex age:(int)age
{
    self = [super init];
    if (self) {
        self.name = name;
        self.sex = sex;
        self.age = age;
    }
    return self;
}

- (void)printInfo {
    NSLog(@"我的名字叫:%@ 今年%d岁 我是一名%@ %@",self.name,self.age,self.sex,NSStringFromClass([self class]));
}
@end

  

多态
  多态性(polymorphism)是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。不同对象以自己的方式响应相同的消息的能力叫做多态。意思就是假设生物类(life)都用有一个相同的 方法-eat;?那人类属于生物,猪也属于生物,都继承了life后,实现各自的eat,但是调用是我们只需调用各自的eat方法。?也就是不同的对象以 自己的方式响应了相同的消息(响应了eat这个选择器)。
实现多态,有二种方式,覆盖(是指子类重新定义父类的虚函数的做法),重载(是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同))。

Cleaner 类

///////////////////    .h    //////////
#import "Person.h"

@interface Cleaner : Person

@end

///////////////////    .m    //////////
#import "Cleaner.h"

@implementation Cleaner

- (void)printInfo {
    NSLog(@"我的名字叫:%@ 今年%d岁 我是一名%@ %@",self.name,self.age,self.sex,NSStringFromClass([self class]));
}

- (void)work {
    NSLog(@"我在扫地");
}

- (void)work:(NSString *)tool {
    NSLog(@"我在用%@扫地",tool);
}
@end

AppDelegate.m 中测试

#import "AppDelegate.h"
#import "Teacher.h"
#import "Student.h"
#import "Person.h"
#import "Cleaner.h"

@interface AppDelegate ()

@end

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    Person *p = [[Person alloc] init];
    p.name = @"隔壁老王";
    p.age = 36;
    p.sex = @"男";

    Teacher *t = [[Teacher alloc] init];
    t.name = @"CJK";
    t.age = 28;
    t.sex = @"女";

    Student *s = [[Student alloc] initWithName:@"小明" sex:@"男" age:12];

    Cleaner *c = [[Cleaner alloc] init];
    c.name = @"程燕飞";
    c.age = 48;
    c.sex = @"女";

    [p printInfo];
    [t printInfo];
    [s printInfo];
    [c printInfo];
    [c work];
    [c work:@"魔法扫帚"];

    return YES;
}

- (void)applicationWillResignActive:(UIApplication *)application {
    // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
    // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
}

- (void)applicationDidEnterBackground:(UIApplication *)application {
    // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
    // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
}

- (void)applicationWillEnterForeground:(UIApplication *)application {
    // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
}

- (void)applicationDidBecomeActive:(UIApplication *)application {
    // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
}

- (void)applicationWillTerminate:(UIApplication *)application {
    // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
}

@end

测试结果:

2015-06-01 17:50:34.174 Attendance[54400:1327317] 我的名字叫:隔壁老王今年36我是一名男 Person

2015-06-01 17:50:34.175 Attendance[54400:1327317] 我的名字叫:CJK 今年28我是一名女 Teacher

2015-06-01 17:50:34.175 Attendance[54400:1327317] 我的名字叫:小明今年12我是一名男 Student

2015-06-01 17:50:34.175 Attendance[54400:1327317] 我的名字叫:程燕飞今年48我是一名女 Cleaner

2015-06-01 17:50:34.175 Attendance[54400:1327317] 我在扫地

2015-06-01 17:50:34.175 Attendance[54400:1327317] 我在用魔法扫帚扫地

本站文章为宝宝巴士 SD.Team原创,转载务必在明显处注明:(作者官方网站:宝宝巴士
转载自【宝宝巴士SuperDo团队】 原文链接: http://www.cnblogs.com/superdo/p/4544543.html

时间: 2024-11-05 05:39:35

[Objective-C] 004_继承封装与多态的相关文章

继承、封装、多态

学习完类与对象终于认识到什么是类,什么是对象了.接下来要看的就是java的三大特征:继承.封装.多态. 一.封装(数据的隐藏) 在定义一个对象的特性的时候,有必要决定这些特性的可见性,即哪些特性对外部是可见的,哪些特性用于表示内部状态.通常,应禁止直接访问一个对象中数据的实际表示,而应通过操作接口来访问,这称为信息隐藏. 1.1.封装的步骤    1).使用private 修饰需要封装的成员变量.        2.)提供一个公开的方法设置或者访问私有的属性             设置 通过s

PHP面向对象详解:继承、封装与多态

首先,在解释面向对象之前先解释下什么是面向对象? [面向对象]1.什么是类? 具有相同属性(特征)和方法(行为)的一系列个体的集合,类是一个抽象的概念2.什么是对象?从类中拿到的具有具体属性值得个体,称为对象,对象是一个具体的个体 所以,面向对象即我们专注对象来处理问题,通过从一个个具有属性和功能的类中拿到对象来处理问题. 下面我们再来细说下面向对象的三大特征:继承/封装/多态 一.继承 在PHP中我们主要通关Extends关键字来实现继承   ->class Student extends P

Java中的继承、封装、多态的理解

Java中的继承.封装.多态 继承的理解: 1.继承是面向对象的三大特征之一,也是实现代码复用的重要手段.Java的继承具有单继承的特点,每个子类只有一个直接父类. 2.Java的继承通过extends关键字来实现,实现继承的类被称为子类,被继承的类称为父类(有的也称其为基类.超类),父类和子类的关系,是一种一般和特殊的关系.就像是水果和苹果的关系,苹果继承了水果,苹果是水果的子类,水果是苹果的父类,则苹果是一种特殊的水果. 3.Java使用extends作为继承的关键字,extends关键字在

python的面向对象的特性(继承、封装、多态)

创建自已对象就python非常核心的概念,事实上,python被称为面向对象语言,本章会介绍如何创建对象.以及面向对象的概念:继承.封装.多态. 多态: 可对不同类的对象使用同样的操作. 封装:对外部世界隐藏对象的工作细节. 继承:以普通的类为基础建立专门的类对象. 多态 面向对象程序设计最有趣的特性是多太,它是是让大多数人犯晕的特性.所以,先来介绍这个. 多态意思是"有多种形式".多态意味着就算不知道变量所引用的对象类是什么,还是能对它进行操作,而它也会根据对象(或类)类型的不同而表

JavaScript基础--面向对象三大特性(八):继承封装多态

一.构造函数基本用法:function 类名(参数列表){属性=参数值} 1 function Person(name,age){ 2 this.name = name; 3 this.age = age; 4 } 5 6 //创建Person对象的时候,可以直接给名字和年龄 7 var p1 = new Person('abc',80); 8 window.alert(p1.name); 9 var p2 = new Person('hello',9); 10 window.alert(p2.

Java中的继承、封装、多态

继承 所谓封装,就是将对象的成员变量和成员函数包装和隐藏起来,对外界通过特定的接口来访问. public class User { private String name; public User (String name) { this.name = name; } public String getName () { return this.name; } public void sayName () { System.out.println(this.getName()); } publi

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

【C/C++学院】0804-C语言和设计模式(继承、封装、多态)

C++有三个最重要的特点,即继承.封装.多态.我发现其实C语言也是可以面向对象的,也是可以应用设计模式的,关键就在于如何实现面向对象语言的三个重要属性. (1)继承性 1.  typedef struct _parent 2. { 3.      int data_parent; 4. 5.  }Parent; 6. 7.  typedef struct _Child 8. { 9.      struct _parent parent; 10.    int data_child; 11. 1

【Java基本功】一文了解Java中继承、封装、多态的细节

本节主要介绍Java面向对象三大特性:继承 封装 多态,以及其中的原理. 本文会结合虚拟机对引用和对象的不同处理来介绍三大特性的原理. 继承 Java中的继承只能单继承,但是可以通过内部类继承其他类来实现多继承. public class Son extends Father{public void go () {System.out.println("son go");}public void eat () {System.out.println("son eat"