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 ...
随机推荐
- &#x开头的是什么编码呢。浏览器可以解释它。如中国等同与中文"中国"?
形如—— &#dddd; &#xhhhh; &#name; ——的一串字符是 HTML.XML 等 SGML 类语言的转义序列(escape sequence).它们不是「编码 ...
- Hadoop之 hdfs 系统
一.NameNode维护着2张表: 1.文件系统的目录结构,以及元数据信息 2.文件与数据块列表的对应关系 存放在fsimage中,在运行的时候加载到内存中的. 操作日志写到edits中 二.Da ...
- retain copy(浅复制) mutablecopy (深复制)
http://blog.csdn.net/xdrt81y/article/details/24331103 口诀: 1浅3深 NSArray copy (浅) 返回NSArray NSArra ...
- CreateRemoteThread远程线程注入Dll与Hook
CreateRemoteThread虽然很容易被检测到,但是在有些场合还是挺有用的.每次想用的时候总想着去找以前的代码,现在在这里记录一下. CreateRemoteThread远程注入 DWORD ...
- Linux CPU负载
昨天查看Nagios警报信息,发现其中一台服务器CPU负载过重,机器为CentOS系统.信息如下: 2011-2-15 (星期二) 17:50 WARNING - load average: 9.73 ...
- FOJ 1205
Problem 1205 小鼠迷宫问题 Accept: 522 Submit: 1679 Time Limit: 1000 mSec Memory Limit : 32768 KB Pro ...
- HTML5/CSS3开发工具
1.谷歌Google Web Designer https://www.google.com/webdesigner/ 这个工具不能在xp上运行,可以在win7 win8上运行 http://www. ...
- error splicing file: file too large解决方法
FAT32格式的usb最大支持4G的文件,拷贝超过4G的文件需要把usb换成NTFS格式.
- MVC 修饰标签
MVC中的修饰标签有很多用途.它以修饰标签形式应用在控制器或控制器中的动作上. 最先想到的就是AcceptVerbs标签,在创建的时候,如果导航到创建视图,但不创建,则: public ActionR ...
- jdk新特性
自动拆装箱子: import org.junit.Test; public class Demo { /* * 自动拆装箱 * */ @Test public void ZhuangXiang() { ...