[C#]面向对象设计
类、对象和方法是面向对象编程的基础。类是将有相同属性或方法的实体的相同属性和方法提取出来就可以构成一个类,在类中定义了数据和实现这些数据的代码;对象是实现了类的具体属性和行为;方法中包括了实现某些功能的代码。
不管是在定义数据成员还是在定义功能成员时,在前面都要加上一些修饰符:public(公共的,在类的内部外部都可访问)、protected(受保护的,只有声明protected类中及声明protected类型成员类的派生类中才可以访问该成员)、internal(内部的,只有在同一程序集之间的文件内才是可以访问的)和private(私有的,可以省去)。他们的作用是控制声明类型的可访问性。public、protected、internal和private等被称为访问修饰符,用于指定声明的成员或类型的可访问性。
面向对象编程语言的三个特点有封装、继承和多态。封装,就是隐藏实现细节,将属性私有化,提供公有方法访问私有属性。继承是从现有的类中派生出新类的功能,它允许创建类层次结构,java中的继承是使用关键字extends来实现的,而.Net是使用“:”来实现的。多态性用一句话来概括就是基类的子类可以显示出多种形态。
一、基础术语
1、对象
对象是具有数据、行为和标识的三部分编程结构。对象的数据包含在对象的字段、属性、事件中。对象的行为则由对象的方法和接口定义。对象通过classe和struts定义。对象通过标识来区分是否相同。对象都是从类和结构中定义的模板实例化得到。均继承于Object类。
2、类
类定义了数据类型的数据和行为。可以根据这些来创建类的实例化对象。类支持继承但不可以多继承。类属于引用对象。最终类可以有很多个基类(类继承基类而导致)。可以实现多个接口。类和对象本质有不同,类是对象的类型,对象是类的实例。
3、分部类
分部类可以将类、结构、或接口的定义拆分到两个或多个源文件中,每个源文件都包括类定义的一部分,编译时把所有部分组合起来。使用partial定义。
4、结构
结构:定义基本于类相同,结构声明时,如果字段不是const或static,就无法初始化。结构不可以声明默认的构造函数(无参构造函数)或析构函数。可以声明带有参数的构造函数。结构副本由编译器自动创建和销毁,故不需要。结构不可以从类或其他结构继承。属于值类型,结构实例化不可以使用new,不可以继承,直接继承自System.ValueType。可以实现接口。
5、继承
类继承通过:号定义,:号后为要继承的单一的基类。由基类派生的类将会获得基类所有非私数据和行为(方法)以及派生类为自己定义的所有其它数据或行为(方法),所以派生类有两个有效类型:派生类型和基类类型。
6、抽象类
使用abstract定义用来继承的类和成员。抽象类不可以实例化,用来提供多个派生类可以共享的基类的公共定义(有点类似接口的意思),抽象类可以定义抽象方法,用abstract定义,但不可以有方法的实现。由抽象类派生的类必须实现抽象方法。
7、密封类
使用sealed关键字来定义防止继承以前标记的为virtual的类或某些成员。密封类主要用来防止派生。
8、多态
一个类可以用作多种类型,可以作自己的类型,可以做基类,可以实现接口时用作任何接口类型。
9、接口
接口使用interface定义,可以描述属于任何类或结构的一组相关行为,可由方法、属性、事件、索引器或这四种成员类型的任何组合构成。接口不可以包含字段,必须为公共的。可以同时继承多个接口,只能继承到方法名称和签名。
10、类成员
包括字段、属性、方法、事件、运算符、索引器、构造函数、析构函数、嵌套类型。
11、方法
方法包括一些类语句的代码块,方法在类或结构中声明,需要指定访问级别,返回值,方法名称以及任何方法参数。
12、构造函数
类和结构可以有多个接受不同参数的构造函数,可以使得可以设置默认值,限制实例化等功能。
13、析构函数
只能对类定义析构函数,并且一个类的析构函数唯一,无法继承和重载,无法调用,无修饰符和参数。
14、字段
包含在类或结构中的对象和值,字段可以使类和结构封装数据。一般用private,通过方法、属性或索引器访问字段。
15、常量
类和结构可以将常数声明为成员,用const修饰。
16、嵌套类型
在类或结构中定义的类型为嵌套类型,默认为private可以设置为其它修饰符,
17、静态类
静态类和类成员用于创建无需创建类的实例就能够访问的数据和函数,静态类成员可以用于分离独立于任何对象标识的数据和行为。
18、面向对象的思想主要包括:继承 多态 封装
封装:用抽象的数据类型将数据和基于数据的操作封装在一起,数据被保护在抽象数据类型内部。
继承:子类拥有父类的所有数据和操作。
多态:一个程序中同名的不同方法共存的情况。
二、名词解释
1、.NET Framework(.NET 框架)
.NET 框架是Microsoft公司的一种新的便捷开发平台。.NET 框架有两个核心组件: CLR(公共语言运行库)和FCL(.NET Framework 类库)。.NET 框架好比一个航母,他支持的开发语言(C#、VB.NET、J#)就像航母上的战斗机。
2、CLR(Common Language Runtime)公共语言运行时
是 .NET Framework 的基础、相当于Java虚拟机。可以将运行库看作一个在执行时管理代码的代理,它提供内存管理、线程管理和远程处理等核心服务,并且还强制实施严格的类型安全以及可提高安全性和可靠性的其他形式的代码准确性。事实上,代码管理的概念是运行库的基本原则。以运行库为目标的代码称为托管代码,而不以运行库为目标的代码称为非托管代码。
3、FCL(Framework Class Library).NET框架类库
它提供了大量的实用类,如:System.console、System.IO等,它是一个综合性的面向对象的可重用类型集合,可以使用它开发多种应用程序,这些应用程序包括传统的命令行或图形用户界面 (GUI) 应用程序。
4、MSIL(Microsoft Inter Language)微软中间语言
所有面向.NET的语言都要先编译成IL, MSIL是将.Net代码转化为机器语言的一个中间过程。当用户编译一个.Net程序时,编译器将源代码翻译成一组可以有效地转换为本机代码且独立于CPU 的指令。当执行这些指令时,实时(JIT)编译器将它们转化为CPU特定的代码。这是为什么.NET能支持多种开发语言的原因。
5、CTS(Common Type System) 通用类型系统
不同编程语言定义的基本数据类型各不相同。既然要实现语言之间的“沟通”,就需要一个规范来实现“不同”数据类型(也许只是名称不同,而实质相同)间的交互操作,CTS就完成这个工作。如C#使用VB.NET开发的类库。
6、CLS(Common Language Specification) 公共语言规范
.NET平台上所有语言都应遵守的规则,用集合来说是多个语言规则的交集。如:在C# 中命名是区分大小写的,而VB.NET不区分大小写,这样CLS就规定,编译后的中间代码必须除了大小写之外有其它的不同这处。
7、JIT(Just-In-Time)
将MSIL编译成计算机能执行的二进制码。强调实时,实时执行时针对本地计算机的不同,被编译成本机代码。
8、Assembly程序集
是.NET程序的最小组成单位。每个程序集都有自己的名称、版本等信息。程序集通常表现为一个文件(.exe或.dll文件),这样的程序集被称为单文件程序集,这种程序集是最常见的。程序集也可以由多个文件组成,每个文件都是一个模块文件或者是一个资源文件,这样的程序集被称为多文件程序集。
三、比较记忆
1、访问修饰符。
public(公共的) |
访问不受限制 |
如果对类不指定访问修饰符,则类的默认访问修饰符为internal,但是类成员的默认访问修饰符为private。类只能修饰为public或internal类成员可以是所有。 |
protected (保护的) |
访问范围限定于它所属的类或从该类派生的类型 |
|
internal(内部的) |
同一程序集中的任何代码都可以访问该类型或成员 |
|
protected internal(内部保护的) |
访问范围限定于同一程序集或那些由它所属的类派生的类型 |
|
private(私有的) |
访问范围限定于它所属的类型 |
2、类与对象
一切事物皆为对象,类是一组具有相同属性和方法的对象的抽象,对象是类的实体,类是对象的抽象。对象是包含数据和操作的实体,它既定义数据元素,又定义可应用这些数据元素的操作。类是对一组具有相同属性和行为的对象的描述,类的内容称为类的成员。
3、静态类与非静态类
所谓静态类即在类的前面用static关键字来修饰的类。这样的类不能被实例化、是密封类、仅包含静态成员、不包含实例构造函数,静态类不能使用new创建实例,用类名就可能直接访问其成员,非静态类则不行。静态类中不能创建非静态的方法。即静态方法中只能创建静态方法,但在非静态类中可以调用静态方法,也可以创建静态成员,包括方法。
4、程序集和命名空间
可以把程序集简单理解为你的.NET项目在编译后生成的*.exe或*.dll文件,一个程序集可以跨越n个命名空间,一个命名空间也可以包含n个程序集。如果说命名空间是类库的逻辑组织形式,那么程序集就是类库的物理组织形式。
5、Const与Readonly
(1)、const 字段只能在该字段的声明中初始化。readonly 字段可以在声明或构造函数中初始化。因此,根据所使用的构造函数,readonly 字段可能具有不同的值。(2)、const 字段是编译时常数,而 readonly 字段可用于运行时常数。(3)、const 默认就是静态的,而 readonly 如果设置成静态的就必须显示声明。(4)、const 对于引用类型的常数,可能的值只能是 string 和 null。readonly可以是任何类型
6、类与结构
(1)、结构是值类型,而类是引用类型。在结构中初始化字段是错误的。
(2)、向方法传递结构时,结构是通过传值方式传递的,而不是作为引用传递的。
(3)、与类不同,结构的实例化可以不使用 new 运算符。结构保存在栈上,而类保存在受管制的堆上。
(4)、结构不能声明默认构造函数或析构函数。结构可以声明带有参数的构造函数。
(5)、一个结构不能从另一个结构或类继承,而且不能作为一个类的基。类是重量级的,而结构是轻量级的。
(6)、所有结构都直接继承自 System.ValueType,所有的引用类型继承自System.Object。
(7)、类与结构都可以实现接口,都包括字段与方法。结构的执行效率更高。
7、装箱和拆箱
装箱(boxing)和拆箱(unboxing)机制使得在C#类型系统中,任何值类型、引用类型和object(对象)类型之间进行转换,这种转换称为绑定连接。装箱:将值类型转换成引用类型,拆箱:将引用类型转换成值类型。
8、接口和类
接口可以多继承,类只能单继承。接口描述可属于任何类或结构的一组相关行为。接口可由方法、属性、事件、索引器或这四种成员类型的任何组合构成。接口不能包含字段。接口成员一定是公共的。类 只支持单继承:类只能从一个基类继承实现。一个类可以实现多个接口。
9、值类型和引用类型
值类型和引用类型的区别在于,值类型的变量直接存放实际的数据,而引用类型的变量存放的则是数据的地址,即对象的引用。值类型变量直接把变量的值保存在堆栈中,引用类型的变量把实际数据的地址保存在堆栈中,而实际数据则保存在堆中。类、数组、接口、委托是引用类型,struct与enum是值类型。
10、重载与override
规则 |
重载(overload) |
覆写(override) |
存在位置 |
存在于同一个类中 |
存在于有继承关系的不同类中 |
调用机制 |
编译时确定 |
运行时确定 |
方法名 |
必须相同 |
必须相同 |
参数列表 |
必须不同 |
必须相同 |
返回值类型 |
可以不相同 |
必须相同 |
泛型方法 |
可以重载 |
可以覆写 |
11、抽象类(abstract class)与接口(interface)
相同点:1、都不能被实例化,都可以通过继承实现其抽象方法;2、都是面向抽象编程的技术基础;
不同点:1、接口支持多继承,也就是说一个类可以实现多个接口;抽象类不能实现多继承;2.接口只能定义抽象规则或对象;抽象类即可以定义抽象的,也可以提供一些已经实现的成员或方法;3、接口只包含方法、属性、索引器、事件的签名,但却不能定义字段和包含实现的方法;抽象类可以定义字段、属性和包含有实现的方法;4.接口属于值类型;抽象类属于引用类型;
12、虚方法(virtual)与抽象(abstract)方法
相同:都可以在派生类中重写;不同点:虚方法在基类中有实现的部分,在派生类中可重写也可不重写;而抽象方法在基类中没有实现的部分,在派生类中必须重写;抽象方法只能在抽象类中,抽象类中可以有实休方法。
四、典型例子
namespace T82 //命名空间
{
public interface objects //定义接口
{
void Objinterface(); //接口中的方法成员,不能有方法体
}
abstract class People:objects //抽象类,没有访问修饰符默认为internal,实现objects接口
{
const string className = "People"; //常量,默认是静态的
public People() { } //构造方法
public People(string _name) { this.Name = _name; } //方法重载
private string name; //字段
public string Name //属性
{
get { return name; }
set { name = value; }
}
public virtual void SayHi() //虚方法
{
Console.WriteLine("Hi,"+this.Name);
}
public abstract void ShowDemo(string DemoString); //定义抽象方法,必须在抽像类中,不能有方法体
public static void ClassName() //静态方法,使用到的成员必须是静态的
{
Console.WriteLine(className); //显示常量
}
public void Objinterface() //必须实现objcets接口的方法
{
Console.WriteLine("Objinterface()");
}
}
class Student:People //继承,
{
public Student(string _name):base(_name){} //调用父类构造方法
public override void SayHi() //重写虚方法
{Console.WriteLine("Hello," + this.Name);}
private string[] nickName=new string[2]; //字段
public string this[int index] //定义索引器
{
get { return nickName[index]; }
set { nickName[index] = value;}
}
public override void ShowDemo(string DemoString) //重写抽象方法
{ Console.WriteLine(this.Name + " is a " + DemoString);}
}
public class Client
{
public static void Main(string[] args)
{
Student s1 = new Student("zhangSan"); //实例化一个学生
Student.ClassName(); //静态方法通过类名调用
s1[0] = "SanSan"; //通过实例名访问字段
s1[1] = "zhangzhang";
Console.WriteLine(s1.Name+"叫"+s1[0] + "也叫"+s1[1]);
s1.SayHi(); //非静态方法通过实例.调用
s1.ShowDemo("Top Student"); //通过实调用已经实现的抽象方法
s1.Objinterface(); //通过s1通用已实现的方法
Console.ReadKey();
}
}
}
转载于:https://www.cnblogs.com/cuishao1985/archive/2009/06/22/1508035.html
[C#]面向对象设计相关推荐
- 7.12 其他面向对象设计原则3: 依赖倒置原则DIP
其他面向对象设计原则3: 依赖倒置原则DIP The Dependency Inversion Principle 7.1 依赖倒置原则DIP The Dependency Inversion P ...
- uml图中的各种箭头_设计模式学习笔记(二):UML与面向对象设计原则
1 UML 1.1 UML UML(Unified Modeling Language)是统一建模语言,1997年11月UML1.1版本提交给OMG并正式通过,成为建模语言的个那个也标准.2003年6 ...
- 面向对象设计领域的OCP原则
一.OCP简介(OCP--Open-Closed Principle ): Software entities(classes,modules,functions,etc.) should be op ...
- 技术图文:01 面向对象设计原则
01 面向对象设计原则 知识结构: 一碟开胃的小菜 小菜今年计算机专业大四了,学了不少软件开发方面的东西,也学着编了些小程序,踌躇满志,一心要找一个好单位.当投递了无数简历后,终于收到了一个单位的面试 ...
- 数据结构与算法:04 C#面向对象设计 II
04 C#面向对象设计 II 知识结构: 5.属性 例1:属性概念的引入(问题) public class Animal {public int Age;public double Weight;pu ...
- 数据结构与算法:03 C#面向对象设计 I
03 C#面向对象设计 I 知识结构: 1.类与对象 类:用高级程序语言实现的一个ADT描述. 对象:通过类声明的变量. 2.封装 2.1 什么是封装 把类的内部隐藏起来以防止外部看到内部的实现过程. ...
- 02面向对象设计原则
技术交流QQ群:1027579432,欢迎你的加入! 1.为什么需要面向对象设计 变化是复用的天敌!面向对象设计最大的优势在于抵御变化! 2.重新认识面向对象 理解隔离变化 从宏观层面上来看,面向对象 ...
- 面向对象设计原则之三:里氏替换原则
里氏替换原则(Liskov Substitution Principle LSP) 里氏替换原则是面向对象设计的基本原则之一.任何基类可以出现的地方,子类一定可以出现.LSP是继承复用的基石,只有 ...
- 如何向妻子解释面向对象设计(OOD)
前言 此文译自CodeProject上<How I explained OOD to my wife>一文,该文章在Top Articles上排名第3,读了之后觉得非常好,就翻译出来,供不 ...
- 程序员必备的七大面向对象设计原则(三)
五.接口隔离原则 1. 定义 i. 客户端不应该依赖那些它不需要的接口. ii. 一旦一个接口太大,则需要将它分割成一些更细小的接口,使用该接口的客户端仅需知道与之相关的方法即可. 2.分析 i. ...
最新文章
- 解决类似umount target is busy挂载盘卸载不掉问题
- 用Python画一只蝙蝠
- Quartz 定时器任务调度
- android异步更新UI
- java impliments,dubbo使用GenericService泛化调用
- 一次失败的蛋疼的设计
- java的多线程总结
- Java获取泛型类的实际类型的实例
- PHP与Spring的强势接口设计_微课介绍
- sql server存储过程解密
- 如何使用 macOS 帮助菜单?
- 【2018】面试复习大纲
- 区块链 以太坊 虚拟机 EVM 详解
- Java 开发流程、运行原理、JVM 规范与实现
- 浏览器缓存之Expires Etag Last-Modified max-age详解
- 虚拟化实验室推进计算机网络专业实践教学的解决方案
- Oracle数据库连接报错
- Base64原理及魔改更换码表
- Lazada市场大数据分析,东南亚年轻群体的消费趋势!
- 初生牛犊不怕虎:年轻人的成长之路
热门文章
- 【408预推免复习】操作系统之文件管理
- Tensorflow【实战Google深度学习框架】—使用 TensorFlow 实现模型
- DeepFake 入门了解
- 【题解】 HDU 2570 迷瘴
- java packetmaster_TCP中间件_java_server
- 计算机office软件改为中文,计算机预装正版Office如何更改为64位程序
- python写入文件后换行_python向文件写入行避免fi末尾的换行
- python 去除str的引号 去除括号_用python进行图像修复与去除水印
- java 反复器_Java数组去掉反复的方法集
- 网络推广外包——网络推广外包指出网站优化首先考虑关键词分类