oc面向对象-封装,继承,多态的用法

面向对象的三大特征

— 封装 (Encapsulation)

— 继承 (Inheritance)

— 多态 (Polymorphism) 

一,封装

1.信息隐藏,隐藏对象的实现细节,不让用户看到。

2.将东西包装在一起,然后以新的完整形式呈现出来。

3.对象同时具有属性和方法两项特性,对象的属性和方法通常被封装在一起,共同体现事物的特性,,二者相辅相承,不能分割 。

4.OC中也有四种访问权限修饰符:@public、@protected、@private、@package。

    private:私有成员,不能被外部函数访问(使用),也不能被子类继承;

  protected:保护成员,不能被外部函数访问,可以被子类继承;

  public:公有成员,可以被外部函数访问,也可以被子类继承。

  OC中,所有的方法(消息),都是公有的

 

二,继承

1.定义一个通用的类,它有基本的实例变量。子类可以 继承了该类,就可以拥有这些实例变量。子类也可以 定义自己的实例变量。

2.被继承的类叫超类或父类(superclass ),继承超类 的类叫子类或派生类(subclass )。

3.OC中继承的语法规则为: @interface 子类 :父类 。

4. OC语言是单继承语言。在OC语言中,基本上所有类的根类都是NSObject类。

举例:请编码实现动物世界的继承关系

· 动物(Animal)具有行为:吃(eat)、睡觉(sleep)

· 动物包括:兔子(Rabbit),老虎(Tiger)
· 这些动物吃的行为各不相同(兔子吃草,老虎吃肉);但睡觉的行为是一致的 

//定义一个Animal类

#import <Foundation/Foundation.h>

@interface Animal : NSObject
//定义两个方法
- (void)eat;//吃
- (void)sleep;//睡觉

@end

#import "Animal.h"

@implementation Animal
//两个方法实现
- (void)eat{
    NSLog(@"进食");
}
- (void)sleep{
    NSLog(@"睡觉");
}
@end

//定义一个Rabbit

@interface Rabbit : Animal

@end

import "Rabbit.h"
@implementation Rabbit
//定义一个兔子子类,继承于动物这个父类(两个方法)
//重写eat这个方法
- (void)eat{
    NSLog(@"兔子吃草");
}

@end

 //定义一个Tiger

@interface Tiger : Animal

@end

#import "Tiger.h"

@implementation Tiger
//定义一个老虎子类,继承于动物这个父类(两个方法)
//重写这个方法
- (void)eat{
    NSLog(@"老虎吃肉");
}

@end

 //main

#import <Foundation/Foundation.h>
#import "Animal.h"
#import "Rabbit.h"
#import "Tiger.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        //兔子这个对象的初始化
        Rabbit *rabbit = [[Rabbit alloc]init];
        //调用自己重写的方法
        [rabbit eat];
        //调用父类的方法
        [rabbit sleep];
        
        Tiger *tiger = [[Tiger alloc]init];
        //调用自己重写的方法
        [tiger eat];
        //调用父类的方法
        [tiger sleep];
        
        
            }
    return 0;
}

 三.多态

1.多态是指同一种类型,具有多种表现形态。

2.多态的条件

 必须存在继承关系。

 父类声明的变量指向子类对象。

 子类重写父类的方法。

例:乐器(Instrument)分为:钢琴(Piano)、小提琴(Violin)。各种乐器的弹奏( play )方法各不相同。演奏家可以使用各种乐器。 

//Actor.h

//使用乐器演奏的方法  
- (void)playWithInstrument:(Instrument *)instrument; 

//Actor.m

//使用乐器演奏的方法  
- (void)playWithInstrument:(Instrument *)instrument {  
  
    [instrument play];  
      
}  

 //Instrument.h

@interface Instrument : NSObject  
  
//演奏  
- (void)play;

 //Instrument.m

//演奏  
- (void)play {  
  
    NSLog(@"乐器演奏");  
      
}  

 //Piano.m

//演奏  
- (void)play  
{  
      
    NSLog(@"钢琴演奏");  
      
}  

 //Violin.m

//演奏  
- (void)play {  
      
    NSLog(@"小提琴演奏");  
      
}  

 //main

#import <Foundation/Foundation.h>
#import "Piano.h"
#import "Actor.h"
#import "Violin.h"
#import "Instrument.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Actor  *actor1 = [[Violin alloc]init];
        [actor1 play];
        Actor  *actor2 = [[Piano alloc]init];
        [actor2 play];
          }
    return 0;
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 
                       

转载于:https://www.cnblogs.com/ios-0728te254096fh/p/5719339.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
#include<iostream.h> #include<string.h> class A { private: char name[15]; char sex[3]; int age; char cata[20]; public: A(); A(char *,char *,int,char *); //构造函数 A(A & obj);//增加了复制构造函数 A & operator=(A & obj);//赋值运算 void setn(char * );//设置名字函数 void sets(char * );//设置性别函数 void seta(int ); void setc(char *); void Display(){cout<<name<<"是一只"<<age<<"岁的"<<sex<<cata<<endl;}; ~A(){cout<<"执行析构函数"<<endl;} }; A::A(){ strcpy(name,"汪汪"); strcpy(sex,"公"); age=10; strcpy(cata,"狗"); cout<<"执行A()构造函数"<<endl; } A:: A(char * n,char * s,int a,char * c){ strcpy(name,n); strcpy(sex,s); age=a; strcpy(cata,c); cout<<"执行A(char *,char *,int,char *)构造函数"<<endl; }//构造函数 void A::setn(char * n){strcpy(name,n);}; void A::sets(char * s){strcpy(sex,s);}; void A::seta(int a){age=a;}; void A::setc(char * c){strcpy(cata,c);} A::A(A &obj){ strcpy(name,obj.name); strcpy(sex,obj.sex); age=obj.age; strcpy(cata,obj.cata); cout<<"执行A(A & obj)构造函数"<<endl; }//复制函数 A & A::operator=(A & obj){ strcpy(name,obj.name); strcpy(sex,obj.sex); age=obj.age; strcpy(cata,obj.cata); cout<<"执行重载'='函数,得:"; cout<<name<<"是一只"<<age<<"岁的"<<sex<<cata<<endl; return *this; }//赋值构造函数 void main(){ A a1;a1.Display();cout<<endl; a1.setn("乐乐");a1.sets("母");a1.seta(1);a1.setc("兔子"); A a2(a1);a2.Display();cout<<endl; a2.setn("喵喵");a2.sets("母");a2.seta(2);a2.setc("猫"); cout<<"现在的a2:";a2.Display();cout<<endl; a2=a1; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值