C#学习笔记(十二)-- 定义类

一、类的相关概念

  类的在默认情况下的声明是内部的,也可以通过internal关键字来显式声明,内部的类只能在项目内部被访问。

  用public关键字可以将一个类指定为公共,这个类可以被其他项目中的代码访问。

  此外,还可以指定类是抽象的abstract(不能实例化,只能继承,可以有抽象成员),或者密封的sealed(只能实例化,不能继承),抽象类和密封类也分为内部的和外部的。

  可以在类的定义中指定继承,在类名后加上冒号,其后是基类名,编译器不允许派生类的可访问性高于基类。如果没有指定使用基类,被定义的类就只能继承于基类System.Object。

二、接口的相关概念

  接口的定义方式与类相似,用的关键字是interface而不是class,类的冒号后面可以接上一个基类和多个接口。

  接口也有内部和外部之分,默认为内部,若要定义为外部就需要使用关键字public。但是接口不能定义为abstract或sealed。

  接口也可以进行继承,但一个接口可以继承多个接口,接口不是类,没有继承System.Object,因此不能用实例化类的方式来实例化一个接口。

三、System.Object

  所有的类最终都是继承于基类System.Object,因此这些类都可以访问该类中收到胡的成员和公共成员。System.Object包含的方法主要有:

  1)Object():System.Object的构造函数,由派生类型的构造函数自动调用;

  2)~Object()(也成为Finalize()):System.Object的析构函数,由派生类型的析构函数自动调用,不能手动调用;

  3)Equals(object):把调用该方法的对象与另一个对象相比,如果它们相等,就返回true。默认的实现代码会查看其他对象参数是否引用了同一个对象(因为对象是引用类型);

  4)Equals(object, object):这个方法比较传给他的两个对象,看看他们是否相等。检查时使用了Equals(object)方法,如果两个对象都是空引用,这个方法就返回true;

  5)ToString():返回一个对应于对象实例的字符串;

  6)MemberwiseClone():通过创建一个新对象实例并复制成员,以复制该对象。成员赋值不会得到这些成员的新实例。新对象的任何引用类型成员都将引用与源类相同的对象,这个方法是受保护的,只能在类或者派生的类中使用;

  7)GetType():以System.Type的形式返回对象的类型,利用GetType和typeof可以很方便地进行对象类型的比较;

  8)GetHashCode():在需要此参数的地方,用作对象的散列函数,它返回一个以压缩形式标识对象状态的值。

四、构造函数与析构函数

  1)在执行一个派生类的构造函数之前,必须先构造其基类,对于这个基类而言,也必须要构造这个基类的基类,直至构造至System.Object.Object()。

  2)构造函数初始化器,使用base(i)关键字可以指定.NET在实例化过程中使用基类中具有指定参数的构造函数

  3)构造函数初始化器,使用this关键字,这个关键字指定在调用指定的构造函数前,.NET的实例化过程对当前类使用非默认的构造函数

五、接口和抽象类

  1)相似之处:抽象类和接口都包含可以由派生类继承的成员。接口和抽象类都不能直接实例化,但可以声明这些类型的变量。如果这样做,就可以使用多态性把继承这两种类型的对象指定给它们的变量。接着通过这些变量来使用这些类型的成员,但不能直接访问派生对象的其他成员。

  2)区别:派生类只能继承自一个基类,即只能直接继承自一个抽象类(但可以用一个继承链包含多个抽象类)。相反,类可以使用任意多个接口。抽象类可以拥有抽象成员(没有代码体,且必须在派生类i中实现,否则派生类本身必须也是抽象的)和非抽象成员(它们拥有代码体,也可以是虚拟的,这样就可以在派生类中重写)。另一方面,接口成员必须都在使用接口的类上实现,它们没有代码提。另外,按照定义,接口成员是公共的(因为它们的目的是在外部使用),但抽象类的成员可以是私有的(只要它们不是抽象的)、受保护的、内部的或受保护的内部成员(其中受保护的内部成员只能在应用程序的代码或者派生类中访问)。此外、接口不能包含字段、构造函数、析构函数、静态成员或常量。

六、结构类型

  对象是引用类型,结构是值类型。

七、浅复制和深复制

  利用基于System.Object的MemberwiseClone()方法,可以简单地按照成员复制对象,这是一个受保护的方法,但很容易在对象上定义一个调用该方法的公共方法,这个方法提供的复制功能称为浅度复制,因为它并没有考虑引用类型成员。因此,新对象中的引用成员就会指向源对象中相同成员引用的对象。

  可以实现一个ICloneable接口,以标准的方式进行深度复制。如果使用这个接口,就必须实现它包含的Clone()方法

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值