面向对象

C语言的面向对象

一曲冷凌霜 提交于 2021-02-08 05:30:05
面向对象的思想,不应受某种语言的限制,面向过程的C语言同样如此。C里面没有类,可以用结构体;没有类的方法,可以使用函数指针; 最重要的,没有继承的概念, 怎么解决呢? 想想强制类型转换,为什么能转换成功呢?这就为实现继承做了基础,加上前面有几篇写过可执行文件的结构,将在后面给出一种方式。 1.一个简单的类 #include<stdio.h> #include<stdlib.h> typedef struct Man { int age; void (*sayHi)(); }Man; void manSayHi(){ printf("hi ... \n"); } Man* createMan(){ return (Man*)malloc(sizeof(Man)); } void deleteMan(Man* m){ free(m); } Man* initMan(Man* m,int age){ m->age = age; m->sayHi = manSayHi; return m; } int main(){ int a; Man* m = initMan(createMan(),30); m->sayHi(); printf("man age = %d \n",m->age); deleteMan(m); //这里只是让弹出的命令窗口,等待一个数值,不消失。 scanf_s("

月影MM对面向对象,原型,函数式的理解

徘徊边缘 提交于 2021-01-04 10:42:49
“面向对象”其实好比是人类成年期学习和整理知识的方法 ——把知识分门别类 比如猫、老虎,都属于猫科动物 class 猫 extends 猫科动物 class 老虎 extends 猫科动物 描述的就是这种认知世界的方式 而“原型”是另一种认知世界的方式,是人类与生俱来的,幼年时期的学习方式 小孩子问父母,老虎是什么 父母可能会回答小孩,老虎很像体型较大的猫 或者说,小孩的意识里“猫”和“老虎”相似 用原型体系来表示,就是 猫.prototype = 一只老虎 或者 老虎.prototype = 一只猫 对于小孩来说,从猫认识老虎,再把它们不一样的部分特别说明 这就是原型体系 所以原型体系就是没有分类的、人类原始认知世界的方式 函数式:functional是什么体系,那个其实是数学体系 functional描述世界的方式和数学家描述世界的方式一致 所以functional的抽象基于数学抽象,它在数学公式、算法的描述上占优势,class的抽象基于类别类系的抽象,prototye的抽象基于形似性的抽象。 来源: oschina 链接: https://my.oschina.net/u/4731/blog/338516

面向对象的一点思考

孤街醉人 提交于 2020-12-21 20:39:30
什么是面向对象?也许你也被面试官曾经这么问过。一直以来,也许你和我一样都不曾纠结与这个问题的答案,这和我们写好程序关系可能不大。我也不清楚为什么面试官会这么问,也许题库上有这么一道题。对于自己没办法回答的问题,我会有拿去考考别人的习惯,后面也有问了好几个学习Java或者C++的朋友,都是有点含糊其辞的回答了关于面向对象语言本身的一些特性,似乎并不是和问题对的上。 很多时候,我很希望要是认识作者就好了,这样,就只需要在平时聊天的时候问他:"嘿,你是怎么想的?"。但现实总是不尽人意的,很多答案我们可能只能自己去猜了。问题上有个非常关键的词:对象。很快,我在google的搜索框中找到了对它的解释: 对象【客体】(英语:Object):指可感知或可想像到的任何事物,既包括客观存在并可观察到的事物(如树木、房屋,抽象的如物价、自由),也包括想像的事物(如神话人物)。 原来这是个哲学概念。对哲学虽然没有什么研究,但是在高中时候被灌输的那点马克思主义的东西,还是可以理解的。有客体就会有主体,主体是实践活动和认识活动的承担着,客体(对象)是主体实践活动和认识活动指向的对象。想想我们人之初,是怎么认识‘鸭’这个物种的? 在见过了各种‘鸭’之后,在我们脑袋中的对‘鸭’的特征和行为便形成了我们对鸭的概念。为什么科学家们会想到用人认识世界的这种方法套用到计算机的身上呢?这让我想起了计算机革命的终极理想:

设计模式—适配器模式

社会主义新天地 提交于 2020-12-03 15:29:03
转载请注明出处: http://blog.csdn.net/singwhatiwanna/article/details/17659905 前言 适配器模式在设计模式体系中属于结构型模式,可以分为三类:类的适配器模式、对象的适配器模式和接口的适配器模式,由于类和接口的适配器模式需要适配器继承原有的类,而纯面向对象语言Java、C#都是不支持多继承的,这在一定程度上制约了类和接口的适配器模式的使用场景,故使用的时候要注意。 使用目的 :将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 类适配器模式 说明: 当新接口出现的时候,由于和老的接口不兼容,这个时候,我们采用一个适配器类实现新的接口并且继承老的业务类,这样就能同时处理新老业务。 示例代码: /** * 原始类 */ class Source { public void oldFunction() { System.out.println("oldFunction:Source"); } } interface Target { void oldFunction(); // 新接口 void newFunction(); } // 适配器,用来做接口转换 class Adapter extends Source implements Target { public

Delphi 面向对象编程 第二章

旧城冷巷雨未停 提交于 2020-05-08 19:40:54
类的声明是一种类型声明,在delphi中,类被当作一个类型来声明,语法为: type class_name = class (base_class) {field } {procedure and function } {property } end; 注意:1、类的声明可以在一个单元的interface或implement部分,但定义必须在implement下。 2、在不指明base_class 的情况下,默认是TObject。 3、数据成员必须在方法和属性之前。 数据(Field):在类中定义好的变量。 方法(procedure and function):类中封装的过程和函数,用于执行类的操作,反映的是行为而不是数据。 属性(property):访问对象数据的接口,即对类私有数据成员进行读写操作。 对象:类的实例化。一般使用构造函数create完成。基本语法: MyObject := TMyObject.Create(); 一个类中可以不止一种构造函数,delphi不自动调用,需要程序员自己调用。 类的操作符: 1、is :用于判定对象的类而不是对象本身。语法:class_variable is class_name; 2、as :把一个对象变量的类型转换成另一类的类型或者把一个接口变量转换成另一接口类型。class_variable as class_name.

需求分析的目的

谁说我不能喝 提交于 2020-04-27 18:03:50
1. 引言 你可能会毫不犹豫的回答:需求分析的目的当然是了解客户需要什么! 这个回答看起来是毫无疑问的,我们当然要了解客户需要什么,我们才能给他们做出他们想要的。 但只做到这样就可以了么? 2. 需求分析样例 我们来看一个简单的需求,客户找到你说:“我要一只羊!” 这个需求够简单吧?那你是不是毫不犹豫的就抓一只羊给客户呢? 如果你这样做了,如果你运气好,客户可能非常满意,但大部分情况,也许客户很不满意,为什么? 我们来看“我要一只羊”这个需求的多个版本: 一个饥肠辘辘的人说,我要一只羊,用来烤着吃! 一个慈爱的父亲说,我要一只羊,给我小孩做宠物! 一个农场主说,我要一只羊,生小羊! 3. 需求分析的目的 看了上面这几幅图,相信你就大概明白了:客户会告诉我们他们的需求,但大部分情况都不会告诉你需求背后的问题。而需求分析的终极目的,就是要“ 挖掘客户的问题,实现客户价值 ”! 因为只有你提供的东西,最后能够解决客户的问题,客户才会满意。如果你提供的东西,没有解决客户的问题,就算你是一五一十的按照客户提的来做的,客户还是不会满意,客户不满意,你的BOSS就会不满意,你的BOSS不满意,你的上司就会不满意。。。。。。最后,损失最大的还是你! 但我们为什么费心费力的要去挖掘客户的问题呢?客户难道不会直接告诉我们么? 客户当然不会告诉你“我饿了”,因为这是他的问题,不是他的需求,他告诉你

再见了,面向对象编程

穿精又带淫゛_ 提交于 2020-04-18 05:53:51
原文: https://medium.com/@cscalfani/goodbye-object-oriented-programming-a59cda4c0e53#.z48fmajih 这是一篇长文,共有三大块,我先翻译第一块,以后有时间更新后面的 我已经用面向对象编程了好几十年了,从最开始的C++然后到Smalltalk最后到.NET和JAVA。我一直期待能充分利用面向对象编程的三大核心:继承、封装、多态带来的好处。我渴望从代码复用这一效果中能窥探到前辈们的智慧。想象着把真实世界映射成代码里各种类,我简直不能太兴奋,还满怀期待的等着他们像真实世界一样正常运转起来。 这样想就大错特错了。 继承,第一个失败的核心 乍一看,继承显然应该是面向对象编程最大的好处。对于刚刚接触面向对象思想的人来说,这些简洁的层级形状示例看起来非常有道理。 而“代码复用”,多年来都是面向对象思想的代名词。我毫不犹豫的接受了这种思想,并且一头扎进刚刚发现的这片新大陆。 “香蕉猴子雨林” 问题 成为面向对象虔诚信徒的我,带着手头的问题,开始构建类层次并编码。一切都还好。 然而,我永远忘不了当我准备利用继承来使用已有类库的那一天,毕竟说好的复用效果就要出现了。我™为这天可等了不少时候了。 一个新项目交到我的手上,我又想起来在自己上个项目中颇为喜爱的一个类。 没问题,复用拯救世界

面向对象

本秂侑毒 提交于 2020-04-07 20:55:28
面向过程与面向对象的不同 面向过程: 核心是"过程"二字 扩展性不足 过程的终极奥义就是将程序流程化过程是"流水线",用 来分步骤解决问题的 面向对象: 核心是"对象"二字 对象的终极奥义就是将程序"整合" 对象是"容器",用来盛放数据与功能的 类也是"容器",该容器用来存放同类对象共有的数据与功能 来源: https://www.cnblogs.com/bailongcaptain/p/12655530.html

Scala之面向对象

强颜欢笑 提交于 2020-04-07 13:32:46
1. Scala基础练习 不使用str.toLong,str.toInt/Integer.valueOf()/Long.valueOf/Integer.parseInt()等,将字符串"123456789" 转化成数字123456789 def method3(): Unit = { val str = "123456789" var sum = 0L for(ch <- str) {//字符串本身就是一个字符数组 sum = sum * 10 + (ch - '0') } println(sum)​ str.toCharArray.map(ch => ch - '0').reduce((v1, v2) => v1 * 10 + v2)} 使用scala完成选择排序 def main(args: Array[String]): Unit = { val array = Array(1, 5, 3, 5, 6, 7, 2, 9) println("排序前的数组:" + array.mkString("[", ", ", "]")) selectSort(array) println("排序后的数组:" + array.mkString("[", ", ", "]")) } /**选择排序 * */ def selectSort(arr:Array[Int]): Unit = {

.Net学习 第2季01 C#面向对象 基础

邮差的信 提交于 2020-04-07 02:00:06
.Net 视频学习第2季 C#面向对象 面向对象 基础 类是一个模板,不占内存,对象是根据模板生成的具象,占内存。 字段field:数据  方法method:函数  属性property:保护字段,对字段的赋值进行限定(将这部分封装在类中,外界不用理会如何实现)属性的本质就是两个方法 get() / set()  外部(甚至类内部的方法)通过属性对字段进行赋值/读取,get()/set()内部会进行限定,字段永远用private,属性才是public的。 namespace Proj { class Person { private int _age; public int Age {      get { return _age; } set { if (value < 0) { value = 0; } _age = value; } } } } 不写字段,只写属性是可以的,编译器会自动生成与属性对应的字段。写好字段后按ctrl+R+E可以生成对应属性。 创建类的对象(实例化)的关键字 new 非静态=实例,非静态类可以有静态成员,也可以有非静态成员,静态成员用类名调用(例如Console.WriteLine();),非静态成员用类的对象来调用。静态类只能有静态成员。注意成员包括字段、属性和方法。 所以对于一个静态的字段/属性,在非静态方法中用this也是访问不到的