objective-c(五)-面向对象之初见

时间:2021-05-02 19:52:03

今天下午没什么事,不上班了,课程设计也不急,本来叫人去逛街的,但现在也不想动,算了,那就不去了,那就来为大家说说objective-c面向对象吧。

我也是初步学objective-c,开这个博客,一方面是为我学习过程记录一下,以后需要回顾的时候好找,另外是想为像我这样已经有一些其他语言开发经验的人提供方便,让大家学起来更加容易,我计划等我把这块学完为这个开个专栏,名字就叫“不从零开始学objective-c”,呵呵``,只是计划,只是计划。

以前有很多很多人问我面向对象是怎么学的,我们学校也开面向对象的课,但大家还是不懂面向对象是怎么学的,每当同学或者朋友问起我都会淡定的打开高洛峰的《细说php》第二版224页有这么一句话:“面向对象这种编程思想是初学者最大的障碍,也是导致很多读者远离面向对象程序设计的一个原因,所以请读者将本章的内容完全掌握之后,再在以后的学习和实践中不断积累,慢慢去理解和掌握面向对象程序设计思想吧”;所以面向对象的思想有时候感觉不是学会的,是慢慢品味出来的,有的人不学多长时间,代码中就处处飘着面向对象的味道,有的人写了几年代码了就仍然是面向过程的代码编写方式,我的建议就是先学学面向对象的鼻祖语言java基础,也就是j2se,建立基本的面向思想,知道面向对象是什么,起码让你去写一个类能写出来,完了我建议去学学j2ee,去接触一下ssh框架,去看看java的设计模式,java的设计模式在ssh中体现的淋漓尽致,假如你学了ssh,你一定会感觉android是个小菜,我是先学的android,后来学校开了j2ee课接触了一下,并不是很熟,但能感觉出那真的很强大,在那里我更深刻的体会了工厂模式,单例模式,面向对象编程,面向接口编程,面向切面编程等等,思想觉悟提高不少,后来在外面做兼职,主要做android应用,就把好多j2ee的思想加了进去,后来做php的课程设计,我仍然使用面向对象,在php中加入了工厂模式还有j2ee的分层架构,感觉代码结构挺好的,这套方法后来也被好好同学学了去。

说这么多,主要是告诉大家,思想是得在实践中慢慢锻炼出来的,所以这不是一个可以急得事,慢慢来,相信我们都可以学好。

不说废话了,开始我们第一个面向对象的程序,我还用以前写的代码来讲:

#import <Foundation/Foundation.h>


@interface  Fraction:NSObject


-(void) print;

-(void) clear;

-(void) setReuslt:(double) s;



-(void) add:(double) a;

-(void) substract:(double) s;

-(void) multipy:(double) m;

-(void) divide:(double) d;



@end


@implementation Fraction


{

   double result;

}


-(void) print{

   NSLog(@"%g",result);

}


-(void) clear{

   result = 0.0;

}


-(void) setReuslt:(double) s{

   result = s;

}


-(void) add:(double)a{

   result += a;

}


-(void) substract:(double)s{

   result -=s;

}


-(void) multipy:(double)m{

   result *= m;

}

-(void) divide:(double)d{

   result /= d;

}


@end


int main(int argc,const char * argv[])

{


    @autoreleasepool {

       double a;

       scanf("%lg",&a);

       Fraction *fraction = [[Fractionalloc] init];

        [fractionsetReuslt:a];

        [fractionadd:3];

        [fractionprint];

        [fractionsubstract:3];

        [fractionprint];

        [fractionmultipy:3];

        [fractionprint];

        [fractiondivide:3];

        [fractionprint];

    }

   return 0;

}


这段代码可以分为三部分,interface/implemention/main

先说main部分,main部分就是main函数部分,这里的作用我就不细说了,程序的入口,等等说了另外两个部分,我来说说main中代码的意思

再说interface部分,我把这部分代码说一下,看下面注释

/*这是interface的开头,这部分可以在面向接口编程中叫做接口部分,也可以叫做声明部分,以@interface开头,@end结束,Fraction为类名,NSObject为父类名,objectve-c的祖宗类就是这玩意,它就好比java中的object类一样*/

@interface  Fraction:NSObject

/*这是方法的声明,“-”代表这是对象级别的方法,(void)是该方法的返回值类型,print是方法名,要是有形参就看setResult方法那样“:(double) s”冒号后面是参数,(double)是型参的类型,a是形参名*/

-(void) print;

-(void) clear;

-(void) setReuslt:(double) s;


-(void) add:(double) a;

-(void) substract:(double) s;

-(void) multipy:(double) m;

-(void) divide:(double) d;


//这里结束

@end


下面看看implemention部分

/*这部分可以叫做实现部分,以@implementation开头,@end结束,Fraction是类名这个得和interface部分类名相同,这是在一个文件里面写着将来把类放在单独文件中,这些会自动生成*/

@implementation Fraction

//这里面定义全局变量,这里定义的变量都是私有变量,将来在类外面访问需要为这个变量提供访问方法,这些方法将来也可以自动生成,这里体现了良好的封装性

{

    double result;

}


//下面是对interface中方法的实现,可以不全部实现

-(void) print{

    NSLog(@"%g",result);

}


-(void) clear{

    result = 0.0;

}


-(void) setReuslt:(double) s{

    result = s;

}


-(void) add:(double)a{

    result += a;

}


-(void) substract:(double)s{

    result -=s;

}


-(void) multipy:(double)m{

    result *= m;

}

-(void) divide:(double)d{

    result /= d;

}


@end


再看看main部分


int main(int argc, const char * argv[])

{


    @autoreleasepool {

        double a;

        scanf("%lg",&a);

//这是生成该类对象,这句话可以分为三部分

//Fraction *fraction;  声明变量

//fraction = [Fraction alloc]; 为该对象分配内存(c语言的方式)

//fraction = [fraction init];  初始化该对象 

        Fraction *fraction = [[Fraction allocinit];

//调用方法,objective-c中方法调用都是[],后面会说到"."的调用方法,但是推荐[]

        [fraction setReuslt:a];

        [fraction add:3];

        [fraction print];

        [fraction substract:3];

        [fraction print];

        [fraction multipy:3];

        [fraction print];

        [fraction divide:3];

        [fraction print];

    }

    return 0;

}


其实没说多少东西,希望对大家有帮助,如果有什么问题,欢迎留言