Object-C学习笔记二-----面向对象编程基础知识

 

其是学过语言的都基本知道面向对象的概念OOP(Object-Oriented Programming),由于自己学习编程时间不长,理解不是很透澈,只是照本宣科,自己理解为主。

关键词: Indirection 理解就是接口

 首先我们先来看2段代码

 NSLog(@"The Number from 1 to 5:");
    for (int i=1; i<=5; i++) {
        NSLog(@"%d\n",i);
    }

  int count=5;
    NSLog(@" The Numbers from 1 to %d:",count);
    for (int i =1; i<=count; i++) {
        NSLog(@"%d\n",i);
    }

同样都是显示数字1-5基本都没有区别。

但是当我去修改要显示1-10时,第一个需要修改两处,而第二处只需要修改一处。这只是一个简单例子。这样就会使代码更容易扩展。

现在我们再看2段代码

    const char *word[4]={"Joe-Bob ß®\"Handyman\" Brown","Jacksonville\"Sly\" Murphy","Sgubara Bain","George \"Guitar\" Books"};
    int wordCount=4;
    for (int i=1; i<wordCount; i++) {
        NSLog(@"%s is %d characters long",word[i],strlen(word[i]));
    }

这里在NSLog(@"%s is %d characters long",word[i],strlen(word[i]));会有一个警告但是没关系。const是常量。

 FILE *wordFile=fopen("/tmp/words.txt", "r");
    char word[100];
    while (fgets(word,100,wordFile)) {
        word[strlen(word)-1]='\0';
        NSLog(@"%s is %d characters long",word,strlen(word));
            
    }
    fclose(wordFile);

不过暂时还没测试通过因为对mac系统不熟悉,不知道如何去添加/tmp/words.txt文件。

没有找到Xcode左边项目下面的Executables有可能是环境不同。

 

过程是编程

先绘制几何图形

typedef enum
{
    KCircle,
    KRectangle,
    KOblateSpheroid
}ShapeType;

typedef enum
{
    kRedColor,
    kGreenColor,
    kBlueColor
}ShapeColor;

//结构
typedef struct
{
    int x,y,width,height;
}ShapeRect;

typedef struct
{
    ShapeType type;
    ShapeColor color;
    ShapeRect rect;
}Shape;
NSString *colorName(ShapeColor colorname)
{
    switch (colorname) {
        case kRedColor:
            return @"red";
            break;
        case kGreenColor:
            return @"green";
        case kBlueColor:
            return @"blue";
        default:
            return @"no color";
            break;
    }
}

void drawCircle(ShapeRect rect,ShapeColor color)
{
    NSLog(@" drawing a circle at(%d %d %d %d) in %@",rect.x,rect.y,rect.width,rect.height,colorName(color));
}

void drawRectangle(ShapeRect rect,ShapeColor color)
{
    NSLog(@" drawing a rectangle at(%d %d %d %d) in %@",rect.x,rect.y,rect.width,rect.height,colorName(color));
 
}

void drawOblatespheroid(ShapeRect rect,ShapeColor color)
{
    NSLog(@" drawing a oblatespheroid at(%d %d %d %d) in %@",rect.x,rect.y,rect.width,rect.height,colorName(color));
}

void drawShapes(Shape shapes[],int count)
{
    for (int i =0; i<count; i++) {
        switch (shapes[i].type) {
            case KCircle:
                drawCircle(shapes[i].rect,shapes[i].color);
                break;
            case KRectangle:
                drawRectangle(shapes[i].rect,shapes[i].color);
                break;
            case KOblateSpheroid:
                drawOblatespheroid(shapes[i].rect,shapes[i].color);
                break;
        }
    }
}


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

    Shape shapes[3];
    ShapeRect rect0 ={0,0,20,50};
    shapes[0].type=KCircle;
    shapes[0].color=kRedColor;
    shapes[0].rect=rect0;
   
    ShapeRect rect1 ={30,40,50,60};
    shapes[1].type=KRectangle;
    shapes[1].color=kGreenColor;
    shapes[1].rect=rect1;
   
    ShapeRect rect2={15,18,37,29};
    shapes[2].type=KOblateSpheroid;
    shapes[2].color=kBlueColor;
    shapes[2].rect=rect2;
   
    drawShapes(shapes,3);
   
    return 0;
}

可以看到有很多地方是重复的,这就会导致占用资源。

//圆接口----------------------------------------------------
@interface Circle : NSObject {
    ShapeColor color;
    ShapeRect rect;
}

-(void) setColor:(ShapeColor) color;//前面有-表示的时方法声明, 没有的则是函数原型
//-(返回类型) 方法名:(参数类型) 参数名
-(void) setRect:(ShapeRect) rect;

-(void) draw;//如果方法没有参数则不使用冒号,反之,有参数则用冒号
@end//Circle

//实现圆的功能------------------------------------------------
@implementation Circle

-(void)setColor:(ShapeColor)c
{
    color=c;
}

-(void) setRect:(ShapeRect)r
{
    rect=r;
}

-(void) draw
{
    NSLog(@"drawing a circle at (%d %d %d %d) in %@",rect.x,rect.y,rect.width,rect.height,colorName(color));
}
@end

修改一部分用接口来实现。但是任然发现他们还是有很多共同之处。如果增加新的会出现大量重复代码。

 

1.object-c是严格区分大小写的。

2完整的句末要加上分号。

3.声明一个变量 int i=4;char *words 这是声明一个指针变量。如果学过c++这个就很熟练了。

4.用到File 中的fopen()用于打开文件,fgets(word)从文件中读取一行文本并将其放入word中,fclose()关闭文件。

5.object-c编程风格建议使用首字母大写的类名。

6.声明枚举,结构,typeof  enum/struct {}名称。

7.开放/封闭原则(Open/Closed Principle)即软件实体应该对扩展开放,对修改关闭。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值