和类先关的小结


  “类”是一种构造,通过使用该构造,您可以将其他类型的变量、方法和事件组合在一起,从而创建自己的自定义类型。 类就像一个蓝图, 它定义类型的数据和行为。
如果类没有声明为静态类,客户端代码就可以创建赋给变量的“对象”或“实例”,从而使用该类。 在对变量的所有引用都超出范围之前,该变量始终保持在内存中。
所有引用都超出范围时,CLR 将标记该变量以供垃圾回收。
如果类声明为静态类,则内存中只存在一个副本,并且客户端代码只能通过该类自身而不是“实例变量”访问该类。

  class 关键字前面是访问级别。 由于在该例中使用 public,因此任何人都可以基于该类创建对象。 类的名称位于 class 关键字的后面。
定义的其余部分是类的主体,用于定义行为和数据。 类的字段、属性、方法和事件统称为“类成员”。

  创建类的实例后,将向程序员传递回对该对象的引用。

类的继承

  继承是通过使用“派生”来实现的,而派生意味着类是使用“基类”声明的,它的数据和行为从基类继承。
通过在派生的类名后面追加冒号和基类名称,可以指定基类。当类声明基类时,它继承基类除构造函数以外的所有成员。因为基类自身也可能继承自另一个类,所以类可以间接继承多个基类。
而且,一个类可以直接实现一个以上的接口。

  特别说明下私有成员被继承的问题:基类私有成员在继承类中,可以通过基类中的代码进行操作。例如:基类中定义的属性——在基类中定义一个私有成员的属性,在继承类中可以读写这个属性,而在属性中操作的是基类私有成员。在的基类没被实例化的前提下,假如私有成员没有被继承下来,那么继承类操作的属性中私有成员是哪来的呢?这时基类应当在内存中没有开辟空间,那么私有字段应当不存在,访问应当报错,可事实却是没有。

  我想这应该C#设计、编译有关,但我不清楚编译时是什么情况。我的想法是,私有成员是被继承下来的,但是在继承类是无法操作的。继承类和基类中私有成员
的关系,就好比你捡到的一个有钱的保险箱(箱子是别人的,也就是好比继承的),但你不知道密码(意思是打不开它)。你能提放箱子、输入密码等(操作属性),但是却取不出钱(钱是箱子内部私有的)。箱子就在手中,钱就在箱子中,但是你打不开箱子,用不了这钱,你说这钱是不是你的?所以私有成员是事实上继承的,但相当于没有被继承(这说的继承后的成员是你可以操作的)。

分部类

  类定义可在不同的源文件之间进行拆分。可以将类或结构、接口或方法的定义拆分到两个或多个源文件中。
每个源文件包含类型或方法定义的一部分,编译应用程序时将把所有部分组合起来。在以下几种情况下需要拆分类定义:

处理大型项目时,使一个类分布于多个独立文件中可以让多位程序员同时对该类进行处理。

使用自动生成的源时,无需重新创建源文件便可将代码添加到类中。 Visual Studio 在创建 Windows 窗体、Web
服务包装代码等时都使用此方法。 无需修改 Visual Studio 创建的文件,就可创建使用这些类的代码。

分部类和方法:http://msdn.microsoft.com/zh-cn/library/wa80x488.aspx

对象

  由于类是引用类型,因此类对象的变量引用该对象在托管堆上的地址。
如果将同一类型的第二个对象分配给第一个对象,则两个变量都引用该地址的对象。类的实例是使用 new 运算符创建的。

结构对象

  由于结构是值类型,因此结构对象的变量具有整个对象的副本。 结构的实例也可以使用 new 运算符来创建,但这不是必需的。

  这就是在赋值时复制结构的一个原因。
相比之下,当对类实例对象的所有引用都超出范围时,为该类实例分配的内存将由公共语言运行时自动回收(垃圾回收)。

  公共语言运行时中高度优化了托管堆上内存的分配和释放。 在大多数情况下,在堆上分配类实例与在堆栈上分配结构实例在性能开销上没有显著的差别。

注意:结构对象是值类型而类是引用类型。

对象标识与.值相等性

  在比较两个对象是否相等时,首先必须明确您是想知道两个变量是否表示内存中的同一对象,还是想知道这两个对象的一个或多个字段的值是否相等。
如果您要对值进行比较,则必须考虑这两个对象是值类型(结构)的实例,还是引用类型(类、委托、数组)的实例。

  若要确定两个类实例是否引用内存中的同一位置(意味着它们具有相同的标识),可使用静态 Equals 方法。

  若要确定两个结构实例中的实例字段是否具有相同的值,可使用 ValueType.Equals 方法。 由于所有结构都隐式继承自
System.ValueType,因此可以直接在对象上调用该方法。

  Equals 的 System.ValueType 实现使用反射,因为它必须能够确定任何结构中有哪些字段。 在创建您自己的结构时,重写 Equals
方法可以提供针对您的类型的高效求等算法。

  要确定两个类实例中字段的值是否相等,您可以使用 Equals 方法或 == 运算符。
但是,只有类通过已重写或重载提供关于那种类型对象的相等含义的自定义时,才能使用它们。类也可以实现 IEquatable<T> 接口或
IEqualityComparer<T> 接口。 这两个接口都提供可用于测试值相等性的方法。

  小结:用==运算符判断两个字符相等,其实里面调用的还是Equals方法,只是在相等和不相等返回的信息不同罢了。通过Equals方法判断是否是同一个对象不靠谱,所以判断两个对象是否是同一个对象用:object.ReferenceEquals();

抽象类、密封类及类成员

  使用 abstract 关键字可以创建不完整且必须在派生类中实现的类和类成员。

  使用 sealed 关键字可以防止继承以前标记为 virtual 的类或某些类成员。

抽象类和类成员

  通过在类定义前面放置关键字 abstract,可以将类声明为抽象类。

  抽象类不能实例化。 抽象类的用途是提供一个可供多个派生类共享的通用基类定义。
例如,类库可以定义一个抽象类,将其用作多个类库函数的参数,并要求使用该库的程序员通过创建派生类来提供自己的类实现。

  抽象类也可以定义抽象方法。 方法是将关键字 abstract 添加到方法的返回类型的前面。

  抽象方法没有实现,所以方法定义后面是分号,而不是常规的方法块。 抽象类的派生类必须实现所有抽象方法。
当抽象类从基  类继承虚方法时,抽象类可以使用抽象方法重写该虚方法。

  此例子可以很好的应用于项目中

public class D

{  public virtual void DoWork(int i) {   // Original
implementation.}}

public abstract class E : D

{  public abstract override void DoWork(int i);}

public class F : E

{  public override void DoWork(int i) {  // New implementation.
}

}

  如果将 virtual 方法声明为 abstract,则该方法对于从抽象类继承的所有类而言仍然是虚方法。
继承一个抽象方法的类不能访问该方法的原始实现。在上一个示例中,类 F 中的 DoWork 不能调用类 D 中的 DoWork。
通过这种方式,抽象类可以强制派生类为虚方法提供新的方法实现。

密封类和类成员

  通过在类定义前面放置关键字 sealed,可以将类声明为密封类。

  密封类不能用作基类。 因此,它也不能是抽象类。 密封类禁止派生。 由于密封类从不用作基类,所以有些运行时优化可以略微提高密封类成员的调用速度。

  在对基类的虚成员进行重写的派生类上,方法、索引器、属性或事件可以将该成员声明为密封成员。 在用于以后的派生类时,这将取消成员的虚效果。
方法是在类成员声明中将 sealed 关键字置于 override 关键字的前面。

  利用密封类不能被继承的特性,可以防止它人在写的类后进行继承造成混乱。例如:String类。

抽象属性

  抽象属性声明不提供属性访问器的实现,它只声明该类支持属性,而将访问器实现留给派生类。

//关键代码

public abstract double Area

{

get;

}

//重写代码

public override double Area

{

get

{

return
radius * radius * System.Math.PI;

}

}

小结

类具有单根性,间接的继承多个类。类可以继承多个接口。

抽象可以包含抽象方法、属性、索引器、事件【其实这几个最后都是方法】;

抽象类必须在抽象类中;

抽象类中可以有实现成员也可以由抽象成员;

抽象类就是为了重写→多态(代码重用);

抽象类中可以有构造函数;

和类先关的小结,布布扣,bubuko.com

时间: 2024-10-21 18:14:53

和类先关的小结的相关文章

C 中SqlParameter类的使用方法小结

C# 中SqlParameter类的使用方法小结 在c#中执行sql语句时传递参数的小经验 1.直接写入法: 例如: int Id =1; string Name="lui"; cmd.CommandText="insert into TUserLogin values("+Id+",'"+Name+"')"; 因为Id是数值,所以在传递的时候只需要在sql字符串中用"+Id+"即可实现,而   Name是

python面向对象——类和对象

一.三大编程范式 编程范式即编程的方法论,标识一种编程风格 三大编程范式: 1.面向过程编程(流水线式) 优点:极大的降低了程序的复杂度 缺点:应用场景固定住了,可扩展性差 2.函数式编程 特点: a.不修改外部传来值的状态 b.精简,可读性差 c.模仿数学里的函数 3.面向对象编程(是用来解决程序的可扩展性的) 优点:解决了程序的可扩展性 缺点:可控性差 二.面向对象设计与面向对象编程 1.面向对象设计 面向对象设计(Object oriented design):将一类具体事物的数据和动作整

第58课 类模板的概念和意义

1. 类模板 (1)一些类主要用于存储和组织数据元素 (2)类中数据组织的方式和数据元素的具体类型无关.如数组类.链表类.Stack类.Queue类等. (3)C++中将模板的思想应用于类,使得类的实现不关注数据元素的具体类型,而只关注类所需要实现的功能. 2. C++中的类模板 (1)以相同的方式处理不同的类型 (2)在类声明前使用template进行标识. (3)<typename T>用于说明类中使用的泛指类型T template <typename T> class Ope

第七课:类、抽象类、绑定方法、反射

上节回顾 面向过程与面向对象 面向过程:核心的就是过程,过程就是解决问题的步骤,就是实现确定先干什么后干什么,面向对象的设计程序就好比是在设计一条流水,是一种机械思维方式. 优点:复杂的问题简单化 缺点:可扩展性差(牵一发而动全身) 用到的一些经典案例:Linux内核,httpd,git 面向对象:核心是对象,要理解对象应该把自己当成上帝.把一切存在的事物都当成对象,不存在的也可以创建出来.对象可以理解为特征(变量)与技能(函数)的结合体. 优点就是可扩展性强. 缺点是无法像面向过程一样准确的知

Python3 之 类属性与实例属性

1.类属性与实例属性 类属性就相当与全局变量,实例对象共有的属性,实例对象的属性为实例对象自己私有. 类属性就是类对象(Tool)所拥有的属性,它被所有类对象的实例对象(实例方法)所共有,在内存中只存在一个副本,这个和C++中类的静态成员变量有点类似.对于公有的类属性,在类外可以通过类对象和实例对象访问. 2.实例:类属性 1 class People(object): 2 name = 'Jack' #类属性(公有) 3 __age = 12 #类属性(私有) 4 5 p = People()

十三、C# 事件

1.多播委托 2.事件 3.自定义事件 在上一章中,所有委托都只支持单一回调. 然而,一个委托变量可以引用一系列委托,在这一系列委托中,每个委托都顺序指向一个后续的委托, 从而形成了一个委托链,或者称为多播委托*multicast delegate). 使用多播委托,可以通过一个方法对象来调用一个方法链,创建变量来引用方法链,并将那些数据类型用 作参数传递给方法. 在C#中,多播委托的实现是一个通用的模式,目的是避免大量的手工编码.这个模式称为 observer(观察者)或者publish-su

Junit&amp;Jmock使用简介

Junit&Jmock简介 序言 2 1. 环境配置 2 2.一种比较好的命名方式 3 3. JUnit使用入门 4 3.1一种简单的实现 4 3.2添加初始化和销毁方法的实现 5 3.3对Java异常(Exception)的单元测试 8 3.4 Assert类 9 3.5小结 12 4.Jmock使用入门 12 4.1一种简单的实现 13 4.2 Expectations类 18 4.3小结 21 5.总结 22 序言 本文的写作目的旨在帮助大家用最少的时间学会使用Junit和Jmock,并能

python 面向对象基础

一.三大编程范式 编程范式即编程的方法论,标识一种编程风格 三大编程范式: 1.面向过程编程 2.函数式编程 3.面向对象编程 二.编程进化论 1.编程最开始就是无组织无结构,从简单控制流中按步写指令 2.从上述的指令中提取重复的代码块或逻辑,组织到一起(比方说,你定义了一个函数),便实现了代码重用,且代码由无结构走向了结构化,创建程序的过程变得更具逻辑性 3.我们定义函数都是独立于函数外定义变量,然后作为参数传递给函数,这意味着:数据与动作是分离的 4.如果我们把数据和动作内嵌到一个结构(函数

python就业班-淘宝-目录.txt

卷 TOSHIBA EXT 的文件夹 PATH 列表卷序列号为 AE86-8E8DF:.│ python就业班-淘宝-目录.txt│ ├─01 网络编程│ ├─01-基本概念│ │ 01-网络通信概述.flv│ │ 02-IP地址.flv│ │ 03-Linux.windows查看网卡信息.flv│ │ 04-ip地址的分类-ipv4和ipv6介绍.flv│ │ 05-(重点)端口.mp4│ │ 06-端口分类:知名端口.动态端口.flv│ │ 07-socket介绍.mp4│ │ │ ├─02