【《Objective-C基础教程 》笔记ch03】(四)OC中的OOP

简介: 一、声明类接口步骤: 1、声明一个类接口,使用@interface关键字加上类名称。 2、用  { 实例变量 }  来定义各种数据成员。 3、方法声明,采用中缀符语法声明一个c函数,用到了冒号 : 。

一、声明类接口步骤:

1、声明一个类接口,使用@interface关键字加上类名称。

2、用  { 实例变量 }  来定义各种数据成员。

3、方法声明,采用中缀符语法声明一个c函数,用到了冒号 : 。


二、声明类接口实例:

//声明圆形circle类接口
@interface Circle : NSObject
{
    ShapeColor fillColor;//每次创建新的Circle对象后,对象中都包括这两个元素——类的实例变量
    ShapeRect   bounds;
}//指定实例变量

-(void) setFillColor: (ShapeColor) fillColor;//方法声明、中缀符
-(void) setBounds: (ShapeRect) bounds;
-(void) draw;

@end //Circle 完成类的声明


三、实现类步骤

1、用关键字@implementation加上类名称

2、实现类中声明的方法,编写方法体 { 方法体 } 。


四、实现类实例


@implementation Circle//类实现

-(void) setFillColor: (ShapeColor) c
{
    fillColor = c;
}//setFillColor

-(void) setBounds: (ShapeRect) b
{
    bounds = b;
}//setbounds

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

@end//Circle 完成类的实现

五、案例练习——几何图形的绘制和填充颜色

//
//  main.m
//  Shapes-Object
//
//  Created by jason on 14-6-10.
//  Copyright (c) 2014年 JasonApp. All rights reserved.
//

#import <Foundation/Foundation.h>

//定义形状的不同颜色
typedef enum{
    kRedColor,
    kGreenColor,
    kBlueColor
} ShapeColor;

//定义一个矩形来指定屏幕上的绘制区域
typedef struct{
    int x,y,width,height;
} ShapeRect;

//负责转换传入的颜色值,并返回NSString字面量
NSString *colorName(ShapeColor color)
{
    switch (color) {
        case kRedColor:
            return @"Red";
            break;
            
        case kGreenColor:
            return @"Green";
            break;
            
        case kBlueColor:
            return @"Blue";
            break;
    }
    
    return @"no clue";

}//colorName

//声明圆形circle类接口
@interface Circle : NSObject
{
    ShapeColor fillColor;//每次创建新的Circle对象后,对象中都包括这两个元素——类的实例变量
    ShapeRect   bounds;
}//指定实例变量

-(void) setFillColor: (ShapeColor) fillColor;//方法声明、中缀符
-(void) setBounds: (ShapeRect) bounds;
-(void) draw;

@end //Circle 完成类的声明

@implementation Circle//类实现

-(void) setFillColor: (ShapeColor) c
{
    fillColor = c;
}//setFillColor

-(void) setBounds: (ShapeRect) b
{
    bounds = b;
}//setbounds

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

@end//Circle 完成类的实现

//定义矩形
@interface Rectangle : NSObject
{
	ShapeColor	fillColor;
	ShapeRect	bounds;
}

- (void) setFillColor: (ShapeColor) fillColor;

- (void) setBounds: (ShapeRect) bounds;

- (void) draw;

@end // Rectangle


@implementation Rectangle

- (void) setFillColor: (ShapeColor) c
{
	fillColor = c;
} // setFillColor


- (void) setBounds: (ShapeRect) b
{
	bounds = b;
} // setBounds


- (void) draw
{
	NSLog (@"drawing a rectangle at (%d %d %d %d) in %@",
		   bounds.x, bounds.y,
		   bounds.width, bounds.height,
		   colorName(fillColor));
} // draw

@end // Rectangle

//定义OblateSphereoids
@interface OblateSphereoid : NSObject
{
	ShapeColor	fillColor;
	ShapeRect	bounds;
}

- (void) setFillColor: (ShapeColor) fillColor;

- (void) setBounds: (ShapeRect) bounds;

- (void) draw;

@end // OblateSphereoid


@implementation OblateSphereoid

- (void) setFillColor: (ShapeColor) c
{
	fillColor = c;
} // setFillColor


- (void) setBounds: (ShapeRect) b
{
	bounds = b;
} // setBounds


- (void) draw
{
	NSLog (@"drawing an egg at (%d %d %d %d) in %@",
		   bounds.x, bounds.y,
		   bounds.width, bounds.height,
		   colorName(fillColor));
} // draw

@end // OblateSphereoid

//定义三角形
@interface Triangle : NSObject
{
	ShapeColor	fillColor;
	ShapeRect	bounds;
}

- (void) setFillColor: (ShapeColor) fillColor;

- (void) setBounds: (ShapeRect) bounds;

- (void) draw;

@end // Triangle


@implementation Triangle

- (void) setFillColor: (ShapeColor) c
{
	fillColor = c;
} // setFillColor


- (void) setBounds: (ShapeRect) b
{
	bounds = b;
} // setBounds


- (void) draw
{
	NSLog (@"drawing a triangle at (%d %d %d %d) in %@",
		   bounds.x, bounds.y,
		   bounds.width, bounds.height,
		   colorName(fillColor));
} // draw

@end // Triangle

//画形状
void drawShapes (id shapes[], int count)
{
    for (int i = 0; i < count; i++) {
        id shape = shapes[i];
        [shape draw];
    }
}//drawShapes

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

    id shapes[4];
	
	ShapeRect rect0 = { 0, 0, 10, 30 };
	shapes[0] = [Circle new];
	[shapes[0] setBounds: rect0];
	[shapes[0] setFillColor: kRedColor];
	
	ShapeRect rect1 = { 30, 40, 50, 60 };
	shapes[1] = [Rectangle new];
	[shapes[1] setBounds: rect1];
	[shapes[1] setFillColor: kGreenColor];
	
	ShapeRect rect2 = { 15, 19, 37, 29 };
	shapes[2] = [OblateSphereoid new];
	[shapes[2] setBounds: rect2];
	[shapes[2] setFillColor: kBlueColor];
    
	ShapeRect rect3 = { 47, 32, 80, 50 };
	shapes[3] = [Triangle new];
	[shapes[3] setBounds: rect3];
	[shapes[3] setFillColor: kRedColor];
	
	drawShapes (shapes, 4);
	
	return (0);
}



六、小结

1、过程式编程——“函数第一,数据第二”

2、OOP——“数据第一,函数第二”

3、“开放/关闭原则”——软件实体应该对拓展开放、对修改关闭

4、objective-c中不存在private方法

5、objective-c运行时负责执行重要的任务,比如对象发送消息和传递参数等,以支持应用程序的运行

6、实例化对象——向相应的类发送new消息来创建对象。




相关文章
|
5月前
|
存储 关系型数据库 数据库
【DDIA笔记】【ch2】 数据模型和查询语言 -- 多对一和多对多
【6月更文挑战第7天】该文探讨数据模型,比较了“多对一”和“多对多”关系。通过使用ID而不是纯文本(如region_id代替&quot;Greater Seattle Area&quot;),可以实现统一、避免歧义、简化修改、支持本地化及优化搜索。在数据库设计中,需权衡冗余和范式。文档型数据库适合一对多但处理多对多复杂,若无Join,需应用程序处理。关系型数据库则通过外键和JOIN处理这些关系。文章还提及文档模型与70年代层次模型的相似性,层次模型以树形结构限制了多对多关系处理。为克服层次模型局限,发展出了关系模型和网状模型。
58 6
|
5月前
|
XML NoSQL 数据库
【DDIA笔记】【ch2】 数据模型和查询语言 -- 概念 + 数据模型
【6月更文挑战第5天】本文探讨了数据模型的分析,关注点包括数据元素、关系及不同类型的模型(关系、文档、图)与Schema模式。查询语言的考量涉及与数据模型的关联及声明式与命令式编程。数据模型从应用开发者到硬件工程师的各抽象层次中起着简化复杂性的关键作用,理想模型应具备简洁直观和可组合性。
39 2
|
5月前
|
SQL 人工智能 关系型数据库
【DDIA笔记】【ch2】 数据模型和查询语言 -- 文档模型中Schema的灵活性
【6月更文挑战第8天】网状模型是层次模型的扩展,允许节点有多重父节点,但导航复杂,需要预知数据库结构。关系模型将数据组织为元组和关系,强调声明式查询,解耦查询语句与执行路径,简化了访问并通过查询优化器提高效率。文档型数据库适合树形结构数据,提供弱模式灵活性,但在Join支持和访问局部性上不如关系型。关系型数据库通过外键和Join处理多对多关系,适合高度关联数据。文档型数据库的模式灵活性体现在schema-on-read,写入时不校验,读取时解析,牺牲性能换取灵活性。适用于不同类型或结构变化的数据场景。
49 0
|
5月前
|
SQL JSON NoSQL
【DDIA笔记】【ch2】 数据模型和查询语言 -- 关系模型与文档模型
【6月更文挑战第6天】关系模型是主流数据库模型,以二维表形式展示数据,支持关系算子。分为事务型、分析型和混合型。尽管有其他模型挑战,如网状和层次模型,但关系模型仍占主导。然而,随着大数据增长和NoSQL的出现(如MongoDB、Redis),强调伸缩性、专业化查询和表达力,关系模型的局限性显现。面向对象编程与SQL的不匹配导致“阻抗不匹配”问题,ORM框架缓解但未完全解决。文档模型(如JSON)提供更自然的嵌套结构,适合表示复杂关系,具备模式灵活性和更好的数据局部性。
53 0
|
5月前
|
敏捷开发 存储 缓存
【DDIA笔记】【ch1】 可靠性、可扩展性和可维护性 -- 可维护性
【6月更文挑战第4天】本文探讨了Twitter面临的一次发推文引发的巨大写入压力问题,指出用户粉丝数分布是决定系统扩展性的关键因素。为解决此问题,Twitter采用混合策略,大部分用户推文扇出至粉丝主页时间线,而少数名人推文则单独处理。性能指标包括吞吐量、响应时间和延迟,其中高百分位响应时间对用户体验至关重要。应对负载的方法分为纵向和横向扩展,以及自动和手动调整。文章强调了可维护性的重要性,包括可操作性、简单性和可演化性,以减轻维护负担和适应变化。此外,良好设计应减少复杂性,提供预测性行为,并支持未来改动。
59 0
|
5月前
|
缓存 关系型数据库 数据库
【DDIA笔记】【ch1】 可靠性、可扩展性和可维护性 -- 可扩展性
【6月更文挑战第3天】可扩展性关乎系统应对负载增长的能力,但在产品初期过度设计可能导致失败。理解基本概念以应对可能的负载增长是必要的。衡量负载的关键指标包括日活、请求频率、数据库读写比例等。推特的扩展性挑战在于&quot;扇出&quot;,即用户关注网络的广度。两种策略包括拉取(按需查询数据库)和推送(预计算feed流)。推送方法在推特案例中更为有效,因为它减少了高流量时的实时计算压力。
53 0
|
5月前
|
存储 消息中间件 缓存
【DDIA笔记】【ch1】 可靠性、可扩展性和可维护性 -- part1 可靠性
【6月更文挑战第2天】本书探讨现代数据系统,阐述其在信息社会中的关键作用,包括数据库、缓存、搜索引擎、流处理、批处理和消息队列等组成部分。随着技术发展,工具如Kafka、Spark和Redis等多功能组件使得系统设计更为复杂。面对可靠性、可扩展性和可维护性的挑战,书中强调了容错和韧性的重要性,区分了硬件故障、软件错误和人为错误,并提出了应对措施。可靠性关乎用户数据、企业声誉和生存,因此是系统设计的核心考量。
52 0
硬件开发笔记(十): 硬件开发基本流程,制作一个USB转RS232的模块(九):创建CH340G/MAX232封装库sop-16并关联原理图元器件
有了原理图,可以设计硬件PCB,在设计PCB之间还有一个协同优先动作,就是映射封装,原理图库的元器件我们是自己设计的。为了更好的表述封装设计过程,本文描述了CH340G和MAX232芯片封装创建(SOP-16),并将原理图的元器件关联引脚封装。
硬件开发笔记(十): 硬件开发基本流程,制作一个USB转RS232的模块(九):创建CH340G/MAX232封装库sop-16并关联原理图元器件