ObjectiveC-07-OOP面向对象程序设计基础

OOP(面向对象程序设计)是一个简单又复杂的课题,之所以简单是因为其概念清晰,内容简单,之所以复杂是因为没有固定的模式可寻,正所谓千人千面。

从本节开始,笔者大概会用5篇左右不同的专题来讲解OOP程序设计,OOP是一种设计思想非OjbectiveC专属,学习OOP编程核心是掌握其思想,然后寻找OOP在不同编程语言中的实现方式。

OOP基本概念

先来看下OOP编程的几个重要概念,下图是笔者自己总结的,可能并不符合多数课本上的描述,非笔者要另起炉罩,只不过不想千篇一律,从另一个角度来理解下OOP。

OOP设计

接口和类

注:在ObjectiveC中的接口实现为协议(protoful),此处我们沿用多数语言的术语还是称为接口。
在这里插入图片描述

  • 接口:声明,只声明作用但不做实现,类似于抽象,在接口中只说明了能做什么事,但具体怎么做并不负责;其作用也可以理解为代理;
  • 类:也称为实现,实现接口中声明的事的具体做法。比如我能生产汽车(接口),但具体怎么生产买家就不需要关心了,我可以建厂生产,也可以找代理,可以放在亚洲生产,也可以放在非洲生产。这种分离的模式会给程序设计带来最大的灵活性,比如更高给的RPC和分布式全是围绕分享思想来设计的。

继承关系

从上面可以看出OOP中的关键元素只有两个,所有OOP的设计全是围绕声明和实现相分离的思想来实现的。继承是OOP中比较核心的一个概念,类比下现实的例子,比如电商的类目,类目鞋可分为男鞋、女鞋。
在这里插入图片描述
上图中有两点需要说明:

  1. 二级关系一般表示 is a的关系;
  2. 多级关系一般除了表示is a的关系后,最重要的是功能实现的抽象;
  3. 类和接口都可以有继承关系,在多数语言中只允许单继承,即is A,就不能是is B;

混合模式

上面我们只是讲了声明和实现的简单关系,在实际编码过程中遇到复杂情况时一般会表现为以下关系,在真实编写代码时只有两种对OOP的使用模式:不用或是混合模式使用,所谓的简单使用多数用于数据模型的抽象上(数据对象的属性设计,无属性操作的实现)。
在这里插入图片描述

抽象类

抽象是一个比较复杂的概念,上述的设计模式是严格区分声明和实现的,在某种程度上有些死板,有没有一种中间状态来综合一下呢,答案就是抽象类,着重理解下设计的改变。
在这里插入图片描述
有几点需要注意:

  1. 抽象类由声明+实现两部分组成;
  2. 抽象类本质上它是一个类,不具备接口的多继承特性。

OOP的问题

业务和抽象

OOP的最大问题就是如何来设计,还是看上面我们举的电商的类目的例子,鞋可以分为女鞋和男鞋,如果再加一个童鞋的话,那么类目要如何设计呢?
在这里插入图片描述
童鞋划分到鞋和童装貌似都合理,但这打破了OOP设计的思想,在现实过程中会给运营和成本合算带来巨大的问题。因为职责不单一,即双头领导,双头汇报。这个问题的解决没有统一的解决方案,读者可以思考下?

业务和组合

OOP还有一种设计思想,组合,这个就是字面意思,但其设计起来也会有很多问题存在,比如下面两种设计模式。
在这里插入图片描述
上面的三种组合设计从OOP角度来看没有好坏之分,我们只能从现实的角度来评价,看下下面几种简单的业务场景:

  • 车厂自己生产所有部件,且不关心轮毂和轮胎,也不关心其数据收集,那么方案1比较合适;
  • 车厂的轮毂和轮胎由不同供应商提供,车厂要时刻关注其数据情况,那么方案2比较合适;
  • 车厂的车轮为标准采购,由供应商管理轮毂和轮胎,车厂只关心标准定义的车轮,那么方案3会比较合适。

OOP的核心

好了,最后总结一下OOP的核心,笔者认为OOP的实现只是一个表面的事情,重在形。其真正的核心并不是编程技巧,而是对实际业务的理解能力,所以掌握OOP的核心笔者认为一定要遵循以下思想:
在这里插入图片描述
重点在于:

  1. 设计或抽象要符合实现业务场景;
  2. 程序实现的目标并不是业务的功能堆砌实现,而是业务场景的还原;

OjbectiveC中的OOP概念

通用的OOP术语

  • 类:class,有时也称对象object,是一种表示对象类型的结构体,包含变量、构造函数、方法,通常采用骆峰式命名方法;
  • 实例:instance,是类的一种具象表式,一个类可以有多个实例,每个实例占有不同的内存地址;
  • 消息:message,一般也称为方法method,指对象可以执行的操作;

ObjetiveC中的术语

以下是ObjectiveC的特殊概念,在ObjectiveC语言中会成对出现,采用同名的方式自动绑定。

  • 接口:interface,类的特征描述;
  • 实现:implementation,使接口可正常工作的代码;
  • 协议:protoful,类功能的补充;
    在这里插入图片描述
    在Objec中,接口和实现是一个固定的组合,这是ObjC语言的一个标准。

命名空间

在ObjC中没有类似java那样的package概念,Objc中的命名空间实际上是由类的前缀来定义的,比如NS表示官方Foundation库对象,CF表示Foundation中最早实现的一批API的命名空间。在真正开发代码时,建议以公司名称的首字母缩写做为所有的类的前缀以此来区分不同的命名空间,或是以模块功能缩写来区分不同的命名空间,比如

//系统api
NSString

//公司缩写
ZZUser

//功能模块,角色注册
ZZRORegister

关于NSObject

和java一样,ObjC的OOP设计过程中,所有的对象也会有一个基类,名为NSObject,它有一些比较有用的方法,常用的如下:

  • -(BOOL) isKindOfClass: class-object:对象是不是class-object 或其子类的成员

  • -(BOOL) isMemberOfClass: class-object:对象是不是class-object的成员

  • -(BOOL) respondsToSelector: Selector:对象是否能够响应selector所指定的方法

  • +(BOOL) isSubclassOfClass: class-object:对象是否是指定类的子类

  • +(BOOL) instancesRespondToSelector: Selector:指定的类实例是否能响应selector

  • -(id) performSelector: selector:应用selector指定的方法

  • -(id) performSelector: selector withObject: object:应用selector指定的方法,传递参数object

  • -(id) performSelector: selector withObject: objectl:withObject: object2:应用selector指定的方法,传递参数objectl和object2

//类实例是否相同
if ([obj1 class] == [obj2 class])

if ( [Square respondsToSelector: @selector (alloc)] == YES )

//类是否包含某个成员, myObj1是一个变量实例, Fraction是一个类
if( [myObj1 isMemberOfClass:[Fraction class] ] )

//指定一个回调方法,一般用于委托
[Fraction instancesRespondToSelector: @selector (setTo:over:)]

- (void) setTo: (int)i over:(int)j{
}

SEL action = @selector(draw:);
- (void) draw{
}

本节内容先了解到这里,这是笔者特意设计的,读者可以先从上述知识上试着自己来实现,后面再详细介绍ObjectiveC中的实现,带着自己的实现来学习ObjC的标准实现可能掌握的会更牢靠,因为OOP就是一学就会,一用就废的东西。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/508007.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

虚拟机ip不停地变每次使用ssh不好登录?有手就行!

欢迎来到我的博客,代码的世界里,每一行都是一个故事 虚拟机ip不停地变每次使用ssh不好登录?有手就行! 桥接模式下固定ip?NoAvahi服务,你值得拥有Avahi解决方案虚拟机中配置Avahi服务配置成功展示测试成功 桥…

MySQL故障排查与生产环境优化

一、MySQL逻辑架构图 客户端和连接服务核心服务功能存储引擎层数据存储层 二、MySQL故障排查 1、MySQL单实例故障排查 故障一 故障现象: ERROR 2002 (HY000): Cant connect to local MySQL server through socket /data/mysql/mysql.sock (2)问题分析&#xff…

使用Pollard_rho算法分解质因数

分解质因数的朴素算法 最简单的算法即为从 [2, sqrt&#xff08;N&#xff09;] 进行遍历。 vector<int> breakdown(int N) {vector<int> result;for (int i 2; i * i < N; i) {if (N % i 0) { // 如果 i 能够整除 N&#xff0c;说明 i 为 N 的一个质因子。…

求组合背包II(acwing)

题目描述&#xff1a; 给定n组循问&#xff0c;每组询问给定两个整数a&#xff0c;b&#xff0c;请你输出Ca^b mod (1e9 7)的值&#xff0c;。 输入格式&#xff1a; 第一行包含整数n。 接下来2行&#xff0c;每行包含一组a和b。 输出格式&#xff1a; …

Vscode下使用markdown入门

1.安装vscode插件 1. **Markdown All in One** ——提供丰富的Markdown相关的快捷键、自动补全功能&#xff0c;提高md文档编写生产力 2. **Markdown Preview Ehanced** ——用于渲染当前编写文档的效果同步预览 3. **Paste Image** ——用于快速引用图片至Markdown文…

视频素材库有哪些网站?八大平台视频素材库创作推荐

视频创作的小达人们&#xff0c;是不是经常在想&#xff0c;视频素材库有哪些网站能提供高质量的素材呢&#xff1f;别担心&#xff0c;今天我要为你们揭秘八个超棒的视频素材网站&#xff0c;让你的视频制作更加轻松在创作的路上如鱼得水&#xff01; 蛙学网&#xff1a;海量…

【tensorflow框架神经网络实现鸢尾花分类_Keras】

文章目录 1、前言2、鸢尾花分类3、结果打印 1、前言 【tensorflow框架神经网络实现鸢尾花分类】一文中使用自定义的方式&#xff0c;实现了鸢尾花数据集的分类工作。在这里使用tensorflow中的keras模块快速、极简实现鸢尾花分类任务。 2、鸢尾花分类 import tensorflow as t…

.DevicData-P-XXXXXXXX勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复

导言&#xff1a; 随着信息技术的飞速发展&#xff0c;网络安全问题日益突出&#xff0c;其中勒索病毒成为了一种日益严重的威胁。.DevicData-P-XXXXXXXX勒索病毒就是其中一种典型的恶意软件&#xff0c;它通过加密用户文件并要求赎金来解锁的方式&#xff0c;给企业和个人带来…

【Java项目】基于SpringBoot的【心灵治愈交流平台】

目录 背景 技术简介 系统简介 界面预览 背景 随着网络不断的普及发展&#xff0c;心灵治愈交流平台依靠网络技术的支持得到了快速的发展&#xff0c;首先要从用户的实际需求出发&#xff0c;通过了解用户的需求开发出具有针对性的首页、系统公告、心理咨询师、心灵专栏、压…

基于springboot实现网上点餐系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现网上点餐系统演示 摘要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对于网上点餐系统当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带动了网上点餐系统…

【了解下Oracle】

&#x1f308;个人主页:程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

网络安全入门教程(非常详细)从零基础入门到精通!

网络安全是一个庞大而不断发展的领域&#xff0c;它包含多个专业领域&#xff0c;如网络防御、网络攻击、数据加密等。介绍网络安全的基本概念、技术和工具&#xff0c;逐步深入&#xff0c;帮助您成为一名合格的网络安全从业人员。 一、网络安全基础知识 1.计算机基础知识 …

java(4)之运算符

1、算术运算符 运算符含义表达式加11-减1-1*乘1*2/除2/1%取余5%2 2、赋值运算符 即 表示将右边的值赋给左边的变量 即 int i &#xff1b; i 1&#xff1b; 运算符含义 表达式 x xyxy-x x-yx - y*x x*yx*y/x x/yx /y%x x%yx %y 代码示例 public class Main {pub…

芒果YOLOv5改进89:卷积SPConv篇,即插即用,去除特征图中的冗余,FLOPs 和参数急剧下降,提升小目标检测

芒果专栏 基于 SPConv 的改进结构,改进源码教程 | 详情如下🥇 👉1. SPConv 结构、👉2. CfSPConv 结构 💡本博客 改进源代码改进 适用于 YOLOv5 按步骤操作运行改进后的代码即可 即插即用 结构。博客 包括改进所需的 核心结构代码 文件 YOLOv5改进专栏完整目录链接:…

环境配置——已解决ModuleNotFoundError: No module named ‘cv2’(python)

一、报错代码 在网上搜到不少用Python处理图形的代码&#xff0c;于是复制别人的代码直接运行却报错&#xff0c;得到的结果却是&#xff1a;已解决ModuleNotFoundError: No module named ‘cv2’。&#xff08;当时心里瞬间凉了一大截&#xff0c;最后顺利解决了&#xff0c;顺…

配置文件乱码

1、改UTF-8 &#xff08;1&#xff09;已经创建的项目 (2)新项目也改一下

皓学IT:WEB07_ JSP

一、Jsp基础语法 1.1. JSP模板元素 JSP页面中的HTML内容称之为JSP模版元素。 JSP模版元素定义了网页的基本骨架&#xff0c;即定义了页面的结构和外观。 1.2. JSP脚本片段 JSP脚本片断用于在JSP页面中编写多行Java代码&#xff08;在<%%>不能定义方法&#xff09;。…

动手机器学习支持向量机+习题

非参数化模型&#xff0c;当数据集规模增大时&#xff0c;其参数量也相应变多 希望从这无数个可以分隔两个点集的超平面中&#xff0c;挑选出与任意一点间隔&#xff08;margin&#xff09;的最小值最大的平面 支持向量机的数学描述 对上式来说&#xff0c;当w和b的大小同时变…

鸿蒙OS开发实例:【ArkTS类库多线程CPU密集型任务TaskPool】

CPU密集型任务是指需要占用系统资源处理大量计算能力的任务&#xff0c;需要长时间运行&#xff0c;这段时间会阻塞线程其它事件的处理&#xff0c;不适宜放在主线程进行。例如图像处理、视频编码、数据分析等。 基于多线程并发机制处理CPU密集型任务可以提高CPU利用率&#x…

学习大数据之JDBC(使用JAVA语句进行SQL操作)(2)

文章目录 PreparedStatement预处理对象sql注入的问题以解决方法&#xff08;预处理对象&#xff09;使用预处理对象(PreparedStatement)实现操作使用预处理对象&#xff08;PreparedStatement&#xff09;实现查询操作使用预处理对象&#xff08;PreparedStatement&#xff09;…