zoukankan      html  css  js  c++  java
  • 封装、继承

    封装:就是包装。

    1.封装隐藏类内部的实现,稳定类外部接口。

    属性封装了实例变量。

    方法封装了具体实现代码。

    类封装了属性和方法。

    2.封装好处

    使用更简单,开发速度更快。不再象面向过程编写零散。

    变量更安全。类里的参数隐藏了。

    可以隐藏实现细节。


    继承:是一个类拥有另一个类的某些特征和行为的特性。

    1.好处:代码可复用。用处:提取类间共同信息。

    2.抽象:现实提取信息到模型的过程

    3.越往上(基类)越简单、抽象,越往下越具体。现实中的分析过程从下往上着手。金字塔模型。

    4.被继承的类称父类(超类),继承的类称子类,子类可直接“拥有”父类中所有非私有成员变量、成员方法。

    5.super编译指示符可以调用父类方法。

    6.OC中属性是特殊的方法,属性就等于设置器同访问器。

    7.OC中的方法都是公有方法,因此子类都能继承父类的方法。

    8.问题:当子类继承父类的方法时,父类不能满足子类的需求,那么写类就可以根据子类实际需求选择修改or放弃。

    方法重写(覆盖)overRide:即子类重写父类方法,发生在子类与父类之间。

    需求:

    a.父类方法部分能用(局部覆盖)。

    b.父类方法完全不能用(完全覆盖)。

    9.(目前在OC中还没重载这个概念)方法重载overLoad:一般发生在本类里面。

    作用:1.丰富该类功能,使其支持多种数据类型等。2.改变原方法的意义。

    重载的定义:当类中方法名字一样,但方法的形参类型或形参个数不一样时,这个方法就是方法的重载(即一个方法多个版本)。

    返回值不作重载的标记,方法重载与返回值无关。(如void add(int a);int add(int a);不叫重载)

    注意:-eat与-eat:是不一样的方法名

    10.OC中哪个初始化就是那个类。

    子类初始化可以赋值给父类对象,转回子类类型的时候要记得强转。父类初始化不建议赋值给子类对象(面向接口编程原则,违背多态,因为只有父类能调用各子类同名方法)。

    11.继承特性

    单根性:(OC中只支持单继承)一个子类只能有一个父类。好处,继承下又可细分父类,动物-会飞的鸟和不会飞的鸟-企鹅。

    传递性:属性、方法能多代传递。

    里氏替换原则:子类重写父类方法问题。

    12.内省(ios检测机制)

    精确判断对象是否指定类型(BOOL)isMemberOfClass:

    判断对象是否指定类型或其子类(BOOL)isKindOfClass:


     Animal.h

    @interface Animal : NSObject
    {
        /*@private修饰私有变量,只能在本类中使用
        @protected修饰保护变量,能在本类与其子类使用.(他是默认值)
        @public修饰公共变量,所以类都能访问,它打破了面向对象的特性,所以不常用,也不建议用它修饰类的成员变量 */
        @private
        NSString *_name;
        BOOL _hasTail;
    }
    
    @property(nonatomic,retain)NSString *name;
    @property(nonatomic,assign)BOOL hasTail;
    -(Animal *)initWithName:(NSString *)aName
                    HasTail:(BOOL)aHasTail;
    
    -(void)eat;
    -(void)wagTail;
    -(void)sleep;
    @end

    Animal.m

    #import "Animal.h"
    
    @implementation Animal
    @synthesize name = _name,
                hasTail = _hasTail;
    
    -(Animal *)initWithName:(NSString *)aName
                    HasTail:(BOOL)aHasTail
    {
        self = [super init];
        if (self)
        {
            self.name = aName;
            self.hasTail = aHasTail;
        }
        return self;
    }
    
    
    -(void)eat
    {
        NSLog(@"%@ is eatting",self.name);
    }
    
    //目前OC中没有重载概念
    //-(void)eat:(NSString *)aMeatName
    //{
    //    
    //}
    //-(void)eat:(int *)aGrassName
    //{
    //    
    //}
    
    -(void)wagTail
    {
        NSLog(@"%@ is waging tail",self.name);
    }
    //OC中所有方法都公开的@public,因此子类都可以继承
    -(void)sleep;
    {
        NSLog(@"%@ is sleeping",self.name);
    }
    
    @end

    Pet.h

    #import "Animal.h"
    
    @interface Pet : Animal
    {
        NSString *_color;
        int _legs;
    }
    
    @property(nonatomic,retain)NSString *color;
    @property(nonatomic,assign)int legs;
    
    -(Pet *)initWithName:(NSString *)aName
                 HasTail:(BOOL)aHasTail
                   Color:(NSString *)aColor
                    Legs:(int)aLegs;
    
    -(void)walk;
    -(void)bark;
    
    @end

    Pet.m

    #import "Pet.h"
    
    @implementation Pet
    
    @synthesize color = _color,legs = _legs;
    
    -(Pet *)initWithName:(NSString *)aName
                 HasTail:(BOOL)aHasTail
                   Color:(NSString *)aColor
                    Legs:(int)aLegs
    {
        //self = [self initWithName:aName HasTail:aHasTail];//这里不能这样用,因为self的对象不存在,只是指向对象的指针
        self = [super initWithName:aName HasTail:aHasTail];//比[super init]好
        if (self)
        {
            self.color = aColor;
            self.legs = aLegs;
            //_name = aName;出错
            self.name =aName;
        }
        return self;
    }
    
    
    -(void)walk
    {
        NSLog(@"%@ walk",self.name);
    }
    -(void)bark
    {
        NSLog(@"%@ bark",self.name);
    }
    
    //重写父类的方法,根据子类自身的特征实现更适合自己的方法
    -(void)sleep
    {
        //NSLog(@"%@ is sleeping",self.name);完全覆盖
        //局部覆盖
        [super sleep];//调用父类的方法实现部分功能,里氏替换原则
        NSLog(@"%@ is close the eyes",self.name);//子类添加额外的内容实现额外的功能(一般是更强大,更具体的功能)
    }
    @end

    Dog.h

    #import "Pet.h"
    
    @interface Dog : Pet
    
    -(void)watchDoor;
    
    @end

    Dog.m

    #import "Dog.h"
    
    @implementation Dog
    
    -(void)watchDoor
    {
        NSLog(@"%@ watchDoor",self.name);
    }
    
    @end

    Cat.h

    #import "Pet.h"
    
    @interface Cat : Pet
    
    -(void)catchMouse;
    
    @end

    Cat.m

    #import "Cat.h"
    
    @implementation Cat
    
    -(void)catchMouse
    {
        NSLog(@"%@ is catching mouse",self.name);
    }
    
    @end

    Flsh.h

    #import "Animal.h"
    
    @interface Flsh : Animal
    -(void)swimming;
    @end

    Flsh.m

    #import "Flsh.h"
    
    @implementation Flsh
    
    -(void)swimming
    {
        NSLog(@"%@ swimming",self.name);
    }
    
    -(void)sleep
    {
        [super sleep];
        NSLog(@"%@ open eyes when sleeping",self.name);
    }
    @end

    AppDelegate.m

    #import "AppDelegate.h"
    #import "Animal.h"
    #import "Dog.h"
    #import "Cat.h"
    #import "Pet.h"
    #import "Flsh.h"
    @implementation AppDelegate
    
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
        self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
        // Override point for customization after application launch.
        self.window.backgroundColor = [UIColor whiteColor];
        
        Dog *d = [[Dog alloc]initWithName:@"旺财"
                                  HasTail:YES
                                    Color:@"black"
                                     Legs:4];
        [d sleep];
        
        Flsh *f = [[Flsh alloc]initWithName:@"NiMo"
                                    HasTail:NO];
        [f sleep];
        //
        Animal *ani =nil;
        ani = [[Dog alloc]initWithName:@"来福"
                               HasTail:YES
                                 Color:@"黄色"
                                  Legs:4];
        
        [ani sleep];//执行的是子类的方法
        //
        Dog *d1 = [[Dog alloc]initWithName:@"大黄"
                                   HasTail:YES
                                     Color:@"黄色"
                                      Legs:4];
        
        Animal *a1 = (Animal *)d1;
        [a1 sleep];
        
    //    Dog *d2 = [[Animal alloc] initWithName:@"小白"
    //                                   HasTail:YES];
    //    [d2 sleep];
        
        Dog *d3 = (Dog *)[[Animal alloc] initWithName:@"小黑"
                                       HasTail:YES];
        [d3 sleep];
        //
        BOOL m = [d3 isMemberOfClass:[Dog class]];
        BOOL k = [d3 isKindOfClass:[Animal class]];
        
        NSLog(@"m = %d , j = %d",m,k);
        //.......................................................
        [self.window makeKeyAndVisible];
        return YES;
    }
  • 相关阅读:
    Extjs4 关于设置form中所有子控件为readOnly属性的解决方案
    Chrome调试(转)
    ExtJS4 动态加载
    CSS display和visibility的用法和区别
    利用Java调用OpenCV进行人脸识别
    Mac上安装openCV(Java版本)
    关于mysql的Fetch Time 和 Duration Time
    数据库相关中间件介绍
    JVM和java应用服务器调优
    探索 ConcurrentHashMap 高并发性的实现机制
  • 原文地址:https://www.cnblogs.com/huen/p/3514215.html
Copyright © 2011-2022 走看看