面向对象编程进阶

结构

结构体可带有方法,字段,索引,属性,运算符方法和事件结构体声明的全局普通变量(不带修饰符的),不能不赋值/在声明时赋值,只能在构造函数里面赋值结构体中声明的全局read

部分情况不用通过new来实例化(结构体与类的new的区别见:八.不同点的第9条)

结构体成员不能指定为abstract,virtual或protected

结构体不能作为其他结构或者类的基础结构

结构体不能继承其他的类或者结构,但是可以实现一个或多个接口

结构体可以定义构造函数,静态构造函数,但不能定义析构函数,不能定义无参构造函数,无参构造函数是自动定义的,且不能被改变

接口

通过接口可以实现多重继承,C# 接口的成员不能有 public、protected、internal、private 等修饰符。原因很简单,接口里面的方法都需要由外面接口实现去实现方法体,那么其修饰符必然是 public。C# 接口中的成员默认是 public 的。
接口成员不能有 new、static、abstract、override、virtual 修饰符。有一点要注意,当一个接口实现一个接口,这2个接口中有相同的方法时,可用 new 关键字隐藏父接口中的方法。
接口中只包含成员的签名,接口没有构造函数,所以不能直接使用 new 对接口进行实例化。接口中只能包含方法、属性、事件和索引的组合。接口一旦被实现,实现类必须实现接口中的所有成员,除非实现类本身是抽象类。
C# 的类是单继承,接口是解决 C# 里面类可以同时继承多个基类的问题。

集合

C#/.NET Framework 提供了很多很有意思的集合类,数组、列表、链表、Set、字典等一系列的类。其中数组是语言的一部分,个人认为严格意义上不属于集合类这一部分。C#开发中常用的集合有数组、 List类、Set接口、Dictionary类、Queue类、LinkedList类等

Array 数组

数组,集合的基础部分,主要特点是一经初始化就无法再次对数组本身进行增删元素。C#虽然添加了一些修改数组的扩展方法,但基本都会返回新的数组对象。

List 列表

List列表为一个泛型类,泛型表示<T>,其中T表示列表中存放的元素类型,T代表C#中可实例化的类型。关于泛型的具体描述以后介绍,现在回过头来继续介绍列表。列表内部持有一个数组对象,列表有两个私有变量:一个是列表容量,即内部数组的大小;另一个是存放的元素数量,通过Count获取。 List列表通过元素数量实现了AddRemove 的操作,列表对象操作引发元素数量变动时都会导致对容量的重新计算,如果现有容量不满足后续操作需要的话,将会对现有数组进行扩充。

Set 集合

C#没有为Set单独设置类,一方面是因为Set出镜率不高,另一方面也因为Set本身的机制所致。Set集合不能包含重复元素,如果尝试存入重复元素集合元素将不会发生任何变化。 Set集合中元素的顺序与存放顺序不一定相同。因为Set集合中存放对于使用者而言是乱序存放的。 我们常用的Set集合有 HashSet<T>SortSet<T>,其他的Set相关类则属于更加少见。至少在我5年多的开发经历中没有用过。

Dictionary 字典

Dictionary 字典,正如它的名称一样,Dictionary 需要指定两个类型,一个作为索引键,一个作为数据值。就像字典一样,每一个词条内容都只有一个字词索引,但可以出现同义词一样。当然,作为我博大精深的中文会出现同字不同音的词组,但是一旦把音、字组合起来作为索引,那还是只会出现一个词条。 所以 Dictionary的使用方式也跟字典一样,通过索引访问和操作数据。

委托

1.委托的基本概念

      委托是面向对象编程的基本思想之一,就是将具有共同特征的某一类具体对象抽象为类。

2. 委托类型的定义

       委托是类型,就好像类是类型一样。与类一样,委托类型必须在被用来创建变量以及类型对象之前声明。

       delegate void MyDel(int x);

   委托类型声明:

   (1) 以deleagate关键字开头。

   (2)返回类型+委托类型名+参数列表。

3. 声明委托变量

4. 初始化委托变量

    (1) 使用new运算符

   new运算符的操作数的组成如下:

   委托类型名

    一组圆括号,其中包含作为调用列表中的第一个成员的方法的名字。方法可以实例方法或静态方法。

   (2)使用快捷语法

   快键语法,它仅由方法说明符构成。之所以能这样,是因为在方法名称

和其相应的委托类型之间有隐式转换。

5. 赋值委托

    由于委托是引用类型,我们可以通过给它赋值来改变包含在委托变量中的方法地址引用。旧的引用会被垃圾回收器回收。

6. 组合委托

    委托可以使用额外的运算符来组合。这个运算最终会创建一个新的委托,其调用列表是两个操作数的委托调用列表的副本的连接。

索引器

索引器的概念
索引器允许类或结构的实例就像数组一样进行索引。无需显式指定类型或实例成员,即可通过运算符[]设置或检索索引值。索引器类似于属性,不同的是索引器的访问器需要使用参数。

索引器的定义
在 C# 中可以使用 this 关键字作为属性名声明索引器,并在方括号内声明参数。索引器也可以使用 C# 中任何有效的访问修饰符,在索引器中为 get 和 set 访问器前指定不同的访问修饰符即可。和属性的定义一样,索引器内也需要定义 get 和 set 访问器,其中 get 访问器返回值。 set 访问器分配值。

封装

将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问。

  • 只能通过规定的方法访问数据。
  • 隐藏类的实例细节,方便修改和实现。

从表格可以看出从上到下封装性越来越差。

异常

异常指的是程序运行过程中发生的特殊响应,通常是由外部问题(如硬件、输入错误)所导致的。 在 C# 等面向对象的编程语言中异常也属于对象。 C# 语言的异常处理功能处理在程序运行期间发生的任何意外或异常情况。异常处理提供了一种把程序控制权从某个部分转移到另一个部分的方式。C# 异常处理时建立在四个关键词之上的:try、catch、finally 和 throw。

try、catch、finally 和 throw 关键字的简述:

try 关键字声明了一个检查特定的异常的代码块,后跟一个或多个 catch 块。
catch 关键字需要和 try 关键字搭配,表示捕获指定的异常类型。
finally 关键字声明一个块来表示执行语句,而且不管程序是否抛出错误都会执行。finally 代码块适合用来释放资源。
异常都是使用 throw 关键字创建而成。当需要抛出一个异常时,可以用 throw 关键字。

委托

 C# 中的委托(Delegate)类似于 C 或 C++ 中函数的指针。委托(Delegate) 是存有对某个方法的引用的一种引用类型变量。引用可在运行时被改变。

匿名

匿名方法顾名思义就是这类方法的特点是不需要特别去定义函数的名字的。一般我们需要一个函数,但又不想花时间去命名它的时候,就可以使用匿名方法。在 C# 中, 匿名方法通常表现为使用 delegate 运算符和 Lambda 表达式。

lambda表达式

继承

继承是类与类的一种关系,是一种“is a”的关系。比如“狗”继承“动物”,这里动物类是狗类的父类或者基类,狗类是动物类的子类或者派生类。如下图所示:

子类拥有父类的所有属性和方法(除了private修饰的属性不能拥有)从而实现了实现代码的复用; 

只要在子类加上extends关键字继承相应的父类就可以了:

多态

面向对象的最后一个特性就是多态,那么什么是多态呢?多态就是对象的多种形态。

父类的引用可以指向本类的对象;

父类的引用可以指向子类的对象;

这两句话是什么意思呢,让我们用代码来体验一下,首先我们创建一个父类Animal和一个子类Dog,在主函数里如下所示:

 

注意:我们不能使用一个子类的引用来指向父类的对象,如:

这里我们必须深刻理解引用多态的意义,才能更好记忆这种多态的特性。为什么子类的引用不能用来指向父类的对象呢?我在这里通俗给大家讲解一下:就以上面的例子来说,我们能说“狗是一种动物”,但是不能说“动物是一种狗”,狗和动物是父类和子类的继承关系,它们的从属是不能颠倒的。当父类的引用指向子类的对象时,该对象将只是看成一种特殊的父类(里面有重写的方法和属性),反之,一个子类的引用来指向父类的对象是不可行的!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值