C#学习笔记(十一)-- 面向对象编程

一、面向对象编程的含义

  过程化编程会导致单一的应用程序,即所有的功能都包含在一个或几个代码模块中。而模块化编程方法提供了丰富的多样性,增加了重用代码的机会,提高项目的可扩展性

二、对象的含义

  对象是OOP程序的一个构件。这个构件封装了部分应用程序,这部分程序可以是一个过程、一些数据或者一些更加抽象的实体。

  对象非常类似于前面所介绍的结构类型。它所包含的变量组成了存储在对象中的数据,其中包含的函数可以访问对象的功能。稍微复杂的对象可能不包含任何的数据,而只包含函数,表示一个过程。

  C#中的对象是从类型中创建的,对象的类型被称之为类。可以使用类的定义来实例化对象,即创建该类的一个命名实例

  1.属性和字段

  包含在对象中的不同数据构成了对象的状态。在实例化一个类的时候,必须提供对类有意义的状态,即提供类的属性和字段

  字段和属性都可以键入,所以可将信息存储在字段和属性中。但属性和字段是不同的,属性不提供对数据的直接访问。如果用字段来表示对象的状态,那么这个变量的取值范围只受该字段变量类型的取值范围的限制,但并不是所有的值都是有意义的。但是如果利用一个属性来表示,就可以对这个值进行限制

  一般情况下,在访问状态时最好提供属性而不是字段,因为这样可以更好地控制各种行为,这个选择不会影响使用对象实例的代码,因为使用属性和字段的语法是相同的。

  对属性和字段的读写访问和访问权限,也可以由对象来明确定义。某些属性是只读的,某些属性是只写的。可访问性确定了上面代码可以访问这些成员,常见的情况是把字段设置为私有,通过公共属性访问它们。这样,类中的代码可以直接访问存储在字段中的数据,而公共属性禁止外部用户访问这些数据,以防外部用户在其中放置无效内容。

  2.方法

  方法这个术语用于表述对象中的函数这些函数调用的方式与其他函数相同,使用返回值和参数的方式也相同。

  方法用于访问对象的功能。与字段和属性一样,方法也可以是公共的或私有的,按照需要限制外部代码的访问。

  3.对象的生命周期

  每个对象都有一个明确定义的生命周期,除了正在使用的正常状态之外,还有两个重要的阶段:

  构造阶段:第一次实例化一个对象时,需要初始化该对象。这个初始化过程称为构造阶段,由构造函数完成。在C#中用New关键字来调用构造函数,构造函数与字段、属性和方法一样,可以是公有或私有的。在类外部的代码不能使用私有构造函数实例化对象,而必须使用公共构造函数。这样,通过把默认构造函数设为私有的,就可以强制类的用户使用非默认的构造函数。一些类没有公共的构造函数,这表明外部的代码不可能实例化它们,这些类被称为不可创建的类,但是这些类并不是完全没用的。

  析构阶段:在删除对象时,需要执行一些清理工作,如释放内存,这由析构函数完成。一般情况下,不需要提供析构函数的代码,而由默认的析构函数自动执行操作,但是如果在删除对象实例之前需要完成一些重要操作,就应提供具体的析构函数。如果变量超出了作用域,代码就无法访问它,但该变量仍然存在于内存中,只有在.NET运行程序执行垃圾回收,进行清理的时候,该实例才被彻底删除。

  4.静态成员和实例成员

  1)静态成员可以在类的实例之间共享,所以可以将它们看成是类的全局对象。静态属性和静态字段可以访问独立于任何对象实例的数据,静态方法可以执行与对象类型相关但与对象实例无关的命令,在使用静态成员时,甚至不需要实例化对象

  使用类中的静态成员时,需要预先初始化这些成员,在声明时,可以给静态成员提供一个初始值,但有时需要执行更复杂的初始化操作,使用静态构造函数可以执行此类初始化任务。一个类只能有一个静态构造函数,该构造函数不能有访问修饰符,也不能带任何参数。静态构造函数不能直接调用只能在下述情况下执行

  创建包含静态构造函数的类实例时;

  访问包含静态构造函数的类的静态成员时。

  在这两种情况下,会首先调用静态构造函数,之后实例化类或者访问静态函数成员。无论创建了多少个类实例,其静态构造函数都只会调用一次。非静态构造函数统一称为实例构造函数。静态类只能包含静态成员,不能包含实例构造函数

三、OOP技术

  1.接口

  接口是把公共实例(非静态)方法和属性组合起来以封装特定功能的一个集合。一旦定义了接口,就可以在类中实现它。这样,类就可以支持接口所指定的所有属性和成员

  注意接口不能单独存在,不能像实例化一个类那样实例化接口。另外,接口不能包含实现其成员的任何代码,而只能定义成员本身。实现过程必须在实现接口的类中完成。

  一个类可以支持多个接口多个类也可以支持相同的接口,接口的概念使用户和其他开发人员更容易理解其他人的代码。

  2.继承

  继承是OOP中最重要的特性之一。任何类都可以从另一个类继承,这就是说,这个类它拥有他继承的类的所有成员。在OOP中,被继承(也称为派生)的类称为父类(也称为基类)。注意,C#中的对象仅能直接派生于一个基类,当然基类也可以有自己的基类。

  派生类不能访问基类的私有成员,但可以访问其公共成员,外部代码与派生类一样都可以访问基类的公共成员,但只有派生类才能访问基类的protected成员,对于外部代码来说,这个可访问性与私有成员一样,不能进行访问。

  基类的成员可以是虚拟的,也就是说,成员可以由继承他的类重写虚拟成员不能是私有成员,不能既要求派生类重写成员,又不让派生类访问该成员。

  基类还可以定义成抽象类。抽象类不能直接实例化,要使用抽象类,必须继承这个类,抽象类可以有抽象成员,这些成员在基类中没有实现代码,所以派生类必须实现它们

  3.多态性

  继承的一个结果是派生与基类的类在方法和属性上有一定的重叠,因此可以使用相同的语法处理从同一个基类实例化的对象。多态性则更进一步,可以把派生类型的变量赋给基本类型的变量,不需要进行强制类型转换,就可以通过这个变量调用基类的方法。不可以直接在派生类中调用基类中实例化的对象,但可以把基本类型的变量转换成派生类变量,然后调用派生类的方法。注意并不是只有共享同一个父类的类才能利用多态性,只要子类和孙子类在继承层次结构中有一个相同的类,它们就可以用同样的方式利用多态性。派生类会继承其基类支持的接口。

  4.对象之间的关系

  1)包含关系:一个类包含另一个类。这类似于继承关系,但包含类可以控制对被包含类的成员的访问,甚至在使用被包含类的成员前进行其他处理

  2)集合关系:一个类用作另一个类的多个实例的容器。这类似于对象数组,但集合具有其他功能,包括索引、排序和重新设置大小

  5.运算符重载可以把运算符用于从类实例化而来的对象,因为类可以包含如何处理运算符的指令。运算符重载只能重载现有的C#运算符,不能创建新的运算符

  6.对象可以激活和使用事件,作为它们处理的一部分。事件是非常重要的,可以在代码的其他部分起作用。

  7.值类型和引用类型

  值类型在内存的同一处存储它们自己和它们的内容

  引用类型存储指向内存中其他某个位置(称为堆)的引用,实际内容存储在这个位置。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值