C#学习笔记(六)——面向对象编程简介
一、面向对象编程的含义
* 是一种模块化编程方法,使代码的重用性大大的增加。
* oop技术使得项目的设计阶段需要的精力大大的增加,但是一旦对某种类型的数据表达方式达成一致,这种表达方式就可以沿用下去,直到这款应用的生命周期结束。
1、对象就是OOP应用程序的一个组成部分,这个组成部件封装了部分应用程序,这部分程序可以是一个过程、一些数据或一些更抽象的实体。对象的类型在OOP中有个特殊的名称叫做类。可以使用类来定义一个对象。
PS:术语“类”和“对象”常常被混淆,但简单的来讲就是,类是模板,而对象是模板做出来的产品
(我们将使用统一的建模语言UML语法来研究类和对象)
比如说Printer和MyPrinter来用UML区别一下类和对象
2、属性和字段
(1)可以通过属性和字段访问对象中包含的数据。这个对象数据可以用于区分不同的对象,因为同一个类的不同对象在属性和字段中存储了不同的值。
(2)属性和字段是不同的,因为属性不提供对数据的直接访问。
(3)UML图
a、可访问性:+号表示公共成员,-号表示私有成员。
b、成员名
c、成员的类型
2、方法
(1)UML图
a、其语法类似于字段和属性,但最后显示的类型是返回类型,在这一部风汇总还显示了方法的参数。
b、in、out和inout他们用于表示数据流的方向,其中out和inout大致对应与学习笔记(五)中讨论的C#关键字out和ref。in 大致对应于C#中不适用这两个关键字的情景。
3、一切皆对象
4、对象的生命周期
(1)两个重要的阶段:
a、构造阶段:对象最初进行实例化的时期。这个初始化过程称为构造阶段,由构造函数完成。
b、析构函数:在删除一个对象时,常常需要执行一些清理工作,例如释放内存,这由析构函数来完成。
(2)构造函数:
对象的初始化工程是自动完成的,但是,在初始化对象的过程中,需要初始化对象储存的数据。构造函数就是用于初始化数据的函数。
所有的类有包括一个以上的构造函数,在这些函数中:有一个默认的构造函数,该函数没有参数,名字和类名一样。类可能还包括几个带参数的构造函数,称为非默认的构造函数。代码可以使它们以许多的方式实例化对象。
在C#中,用new关键字来调用构造函数。
构造函数与字段和属性一样,可以是共有或私有的。在类外部的外码不能使用私有构造函数来实例化对象,而必须使用公共的构造函数。
(3)析构函数
不应该依赖析构函数来书房对象实例所使用的函数,因为在不再使用某个对象后,该资源会长时间被该对象占用。如果所使用的资源非常重要,这样做就有可能出问题。(后面的会有解决的办法)。
4、静态和实例类函数
(1)类还有静态成员,静态成员可以在类的实例之中共享,在使用静态成员的时候甚至不需要实例化对象。
UML图表示法:
在UML图中,类的静态成员用下划线表示。
(2)静态构造函数
使用类中的静态成员时,需要预先初始化这些成员。使用静态构造函数可以执行这种初始化任务,一个雷只能有一个静态构造函数,但是构造函数不能带有访问修饰符,也不能带任何参数。
静态构造函数不能直接调用,只能在下述情况中执行:
a、创建包含静态构造函数的类实例时
b、访问含静态构造函数的类的静态成员时
(3)静态类
如果我们想类只含有静态成员,一种简单的方法就是使用静态类,而不是把类的构造函数设置为私有,静态类只能包含静态成员。
二、OOP技术
1、接口
(1)接口是把公共实例(非静态)方法和属性组合起来,以封装特定方法的集合。
(2)注意,接口不能单独存在,不能像实例化一个类那样实例化接口。另外,接口不能包含实现其成员的任何代码,而只能定义成员本身。实现过程必须在实现接口的类中完成。
(3)UML语言在对象上实现接口。(一般接口的名称一般用大写字母I开头)
(4)一个类可以支持多个接口,多个类也可以使用同一个接口。
(5)在发布接口之后(比如说我们使用的MATLAB),即接口可以用于其他开发人员或终端用户后,最好不要修改它。如果以后做了修改,也许是升级了底层的代码,但是也许会导致使用者不能正确运行接口,甚至失败,我们应创建一个新的接口,来扩展旧接口,例如可以包含一个版本号。
(6)支持IDisposable接口的对象必须实现其Dispose()方法,即他们必须提供这个方法的代码。当不再需要某个对象的时候就调用这个方法,释放重要的资源,负责,该资源会等到析构函数的时候才释放。
C#允许使用一种可以优化使用这个方法的结构。using关键字可以在代码块中初始化使用重要资源的对象,会在这个代码块的末尾自动调用Dispose()方法,用法如下:
<ClassName><VariableName> = new <ClassName>()
……
using(<VaribaleName>)
{
……
}
或者也可以:
using(<ClassName><VariableName> = new <ClassName>())
{
……
}
可以在using代码块中使用变量<VariableName>,并在代码块的末尾自动删除(在代码块执行完毕后,调用Dispose())。
2、继承
(1)任何类都可以从另一个类中继承,这就是说,这个类拥有他继承的类的所有成员。在OOP中,被继承(派生)的类成为父类(基类)。
Attention:注意C#中的对象只能直接派生于一个基类。
(2)UML图中来表示基类。
用一个箭头来表示继承的关系。
(2)派生类不能访问基类的私有成员,但是可以访问其公有和受保护的成员。而外部代码只能访问公有成员,而不能访问私有成员还有受保护成员。
(3)基类可以定义为抽象类,抽象类不能够直接实例化,要使用这个类,必须继承这个类,抽象类中有抽象成员,这些成员在基类中没有实现代码,这些代码的实现是在派生类中提供。
Attention:接口也可以继承自其它接口,但与类不同的是,接口可以继承多个基接口。
三、多态性
(1)多态性是指某个派生类型的变量可以赋给基本类型的变量,而不用进行强制类型转换就可以通过这个变量来调用基类的方法,但最终的结果是调用了派生类中的方法来实现代码。
(2)基本类型转换成派生类型的时候需要使用强制类型的转换。
(3)C#中,所有的类都派生于Object这类。
(4)接口的多态性:尽管接口不能实例化,但是可以建立接口类型的变量,然后就可以在支持该接口的对象上使用这个变量访问该接口提供的方法和属性。
4、对象之间的关系:
包含、集合
5、运算符重载
简而言之,就是重新定义C#中已有的运算符的法则。
6、事件:
对象可以激活事件,作为他们处理的一部分。暂时可以理解为中断、
7、引用类型和值类型
换句话说就是指针和变量。
C#学习笔记(六)——面向对象编程简介的更多相关文章
- javascript 学习笔记之面向对象编程(一):类的实现
~~想是一回事,做是一回事,写出来又是一回事~~一直以来,从事C++更多的是VC++多一些,从面向过程到面向对象的转变,让我对OO的编程思想有些偏爱,将一个客观存在的规律抽象出来总是让人比较兴奋,通过 ...
- JavaSE学习笔记05面向对象编程01
面向对象编程01 java的核心思想就是OOP 面向过程&面向对象 面向过程思想: 步骤清晰简单,第一步做什么,第二步做什么...... 面向过程适合处理一些较为简单的问题 面向对象思想: 物 ...
- python 学习笔记7 面向对象编程
一.概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发"更快更好更强..." ...
- C++ Primer 学习笔记_67_面向对象编程 --转换与继承、复制控制与继承
面向对象编程 --转换与继承.复制控制与继承 I.转换与继承 引言: 由于每一个派生类对象都包括一个基类部分,因此能够像使用基类对象一样在派生类对象上执行操作. 对于指针/引用,能够将派生类对象的指针 ...
- javascript 学习笔记之面向对象编程(二):继承&多态
~~接上篇~~上一篇实现了类的实现以及类成员变量和方法的定义,下面我们来了解下面向对象中两个最重要的特性:继承和多态. 继承 js中同样可以实现类的继承这一面向对象特性,继承父类中的所有成员(变量和属 ...
- C++ Primer 学习笔记_69_面向对象编程 --继承情况下的类作用域
面向对象编程 --继承情况下的类作用域 引言: 在继承情况下,派生类的作用域嵌套在基类作用域中:假设不能在派生类作用域中确定名字,就在外围基类作用域中查找该名字的定义. 正是这样的类作用域的层次嵌套使 ...
- Spark学习笔记11面向对象编程
面向对象编程 11.1 object类 11.1.1定义一个简单的类 11.1.2 field的getter与setter 定义类包含,定义类的field及方法.其格式如下 class Cla ...
- C++ Primer 学习笔记_72_面向对象编程 --句柄类与继承[续]
面向对象编程 --句柄类与继承[续] 三.句柄的使用 使用Sales_item对象能够更easy地编写书店应用程序.代码将不必管理Item_base对象的指针,但仍然能够获得通过Sales_item对 ...
- python学习笔记(七):面向对象编程、类
一.面向对象编程 面向对象--Object Oriented Programming,简称oop,是一种程序设计思想.在说面向对象之前,先说一下什么是编程范式,编程范式你按照什么方式来去编程,去实现一 ...
- python自动化测试学习笔记-7面向对象编程,类,继承,实例变量,邮件
面向对象编程(OOP)术语: class TestClass(object): val1 = 100 def __init__(self): self.val2 = 200 ...
随机推荐
- Android-深入理解android自定义属性(AttributeSet,TypedArray)
属性 自定义属性,首先要定义出来属性,我们新建一个attrs.xml: <?xml version="1.0" encoding="utf-8"?> ...
- Dean Edwards大神写的addEvent库
直接晒代码: // written by Dean Edwards, 2005 // with input from Tino Zijdel, Matthias Miller, Diego Perin ...
- 分析器错误消息: 类型“test.test.testx”不明确: 它可能来自程序集“F:\testProject\bin\test.test.DLL”或程序集“F:\testProject\bin \testProject.DLL”。请在类型名称中显式指定程序集。
问题描述: RT 分析器错误消息: 类型“test.test.testx”不明确: 它可能来自程序集“F:\testProject\bin\test.test.DLL”或程序集“F:\testProj ...
- 批量删除wordpress垃圾评论留言
wordpress博客的存在,垃圾评论注定会找上门来.大家还可以用Akismet.Bad Behavior.Spam Karma等一些其他的插件或者直接用程序写个验证码函数对留言进行验证来过滤 垃圾评 ...
- 在VMware上面安装Solaris 10
导读 Oracle Solaris 11 是世界上最先进的企业操作系统,提供安全.速度.简单的企业云环境和DevOps.在这篇文章中我们将使用Solaris 10版本,但您可以按照同样的步骤,来安装刚 ...
- Mathematica 中 Minimize函数无法找到全局最小值时的解决方法
一直使用Minimize来找到指定约束下的函数的最小值,最近发现在一个非线性函数中使用Minimize无法提供一个"全局"最小值(使用Mathematica只是用来验证算法的,所以 ...
- nginx(五)nginx与php的安装配置
经过前面学习,对nginx有个大概的了解,来配置LNMP;只要是在系统安装过程中选择安装比较齐全的包,基本上系统都能满足安装要求,下面是我一个一个测试的,基本上全部安装所需的库文件,放心安装: [ro ...
- [官方教程] [ES4封装教程]1.使用 VMware Player 创建适合封装的虚拟机
[转载处,http://bbs.itiankong.com/] 前言: 首先要明确的一点,系统封装操作的源计算机一般为虚拟计算机(简称虚拟机.VM等),这也是为什么我们要在封装教程的第一章就专门学习虚 ...
- OI 中的 FFT
不行啊最近备考简直变成文化狗了= =..我还脑洞大开想学俄语什么心态.. 简单地说一下FFT(来,跟我一起念,法〰法〜塔,法斯特~福铝页~圈死佛而母).. FFT本来是做信号变换用的,当然OI和信号变 ...
- call_user_func_array使用原型
If you need to call object and class methods in PHP < 4.0.4, the following code ought to do the t ...