zoukankan      html  css  js  c++  java
  • Objective-C基础1:OC中类的继承和组合

    1.类的定义和声明

    OC中的类声明是以@interface开始@end结束。

    OC中的类定义以@implementation开始@end结束。

    OC中的方法声明:

    - (void) setName : (NSString*) strName;前面的短线-表示这是一个方法,(void)表示返回值, setName表示方法名称,(NSString*) StrName表示参数是NSString*类型,名称是strName,注意:()一定要加

    OC中的成员变量定义在类声明的{}中,这一点跟方法声明不一样,方法在{}外

    OC中的对象创建方法:Animal* animal = [Animal new]; 表明对Animal类调用new方法分配一块内存创建对象。

    OC中的方法调用:[animal setName : @"akon"];表明调用对象animal方法setName,传入参数为akon。

    需要注意的是:OC中的方法调用都是以中括号[]括起来的。

    编程好习惯:类名以大写字母开头,方法名和变量名字以小写字母开头。

    例子:

    ///声明
    @interface Animal : NSObject
    {
    @private
    NSString* strName;
    }
    - (void) setName : (NSString*) strName;
    - (NSString*) getName;
    
    @end
    
    //定义
    @implementation Animal
    
    - (void) setName : (NSString*) strNameIn
    {
        strName = strNameIn;
    }
    
    - (NSString*) getName
    {
        return strName;
    }
    
    
    @end
    
    int main(int argc, const char * argv[]) {
        
        Animal* animal = [Animal new];
        [animal setName : @"akon"];
        NSString* strName = [animal getName];
        NSLog(@"name:%@", strName);
        return 0;
    }
    

    2.类的继承

    其实上面例子中的Animal就演示了类的继承Animal类继承于NSObject,为了加深印象,分别创建两个类Cat和Dog继承于父类Animal,代码如下:

    @interface Animal : NSObject
    {
    @private
    NSString* strName;
    }
    - (void) setName : (NSString*) strName;
    - (NSString*) getName;
    - (NSString*) manCallMe;
    
    @end
    
    @interface Cat : Animal
    
    @end
    
    @interface Dog : Animal
    
    @end
    
    #endif
    

     上述Animal类定义了一个方法manCallMe,定义这个方法的意图是为了实现类似C++里面的虚函数,C++里面是通过虚函数来实现动态绑定的。

     那么OC是如何实现动态绑定的呢?只要子类覆盖父类的方法即可。代码见下:

    //
    //  Animal.m
    //  TestCons
    //
    //  Created by mac on 15/1/17.
    //  Copyright (c) 2015年 akon. All rights reserved.
    //
    
    #import <Foundation/Foundation.h>
    #import "Animal.h"
    
    @implementation Animal
    
    - (void) setName : (NSString*) strNameIn
    {
        strName = strNameIn;
    }
    
    - (NSString*) getName
    {
        return strName;
    }
    
    - (NSString*) manCallMe
    {
        return @"Animal";
    }
    
    @end
    
    
    @implementation Cat
    
    - (NSString*) manCallMe
    {
        return @"Cat";
    }
    
    @end
    
    @implementation Dog
    
    - (NSString*) manCallMe
    {
        return @"Dog";
    }
    @end
    

     在创建对象的时候,以id类型保存对象指针,代码如下:

    int main(int argc, const char * argv[]) {
        
        id animal[3];
        animal[0] = [Animal new];
        [animal[0] setName : @"a"];
        animal[1] = [Cat new];
        [animal[1] setName : @"b"];
        animal[2] = [Dog new];
        [animal[2] setName : @"c"];
        for (int i = 0; i < 3; ++i) {
            NSLog(@"getName:%@, manCallMe:%@", [animal[i] getName], [animal[i] manCallMe]);
        }
        return 0;
    }
    

    有的时候子类需要调用父类的方法,如何做,类似于C++__super关键字,OC中有有super关键字,比如在Cat中调用Animal的manCallMe方法,这样干:

    [super manCallMe]

    3.类的组合

    继承跟组合是复用类的两种方法,那么什么时候用继承什么时候用组合呢?继承强调的是"是一种"关系,比如猫是动物的一种,够是动物的一种。那么猫和狗就应该继承于动物。组合强调的是''有''的关系,比如动物有腿,有眼睛,那类动物就应该组合腿和眼睛。

    组合的实现很简单,就是简单地把方法调用委托给被组合类。比如动物类有个方法'"放电",那么这个方法的实现就可以调用眼睛的放电方法来实现。由于很简单,代码就不上了。

  • 相关阅读:
    怎样创建动态扩容数组?
    怎样终止一个线程?
    模式识别
    基于Linux根据僵尸网络病毒平台《比尔盖茨》
    web.xml在&lt;init-param&gt;一个错误
    DTD学习笔记
    Java排序算法(四):Shell排序
    VC6迁移到VS2008几个问题——良好的代码,从我做起,从现在开始。
    Maven 建 Struts2 基本实现 CURD Controller
    Andy&#39;s First Dictionary
  • 原文地址:https://www.cnblogs.com/52xpz/p/4232342.html
Copyright © 2011-2022 走看看