.NET 面向对象

一、访问级别约束:
①子类的访问级别不能别父类高(会暴露父类的成员)

②类中的属性或字段的访问级别不能比所对应的类型访问级别高

③方法的访问级别不能比方法的参数和返回值的访问级别高
(用于解决“可访问性不一致的问题”)


二、虚方法实现多态
①将父类的方法的访问修饰符后加上“virtual”关键字

②当一个方法是虚方法时,那么这个方法的子类可根据需要就可以重写了。

③子类继承父类以后,可以直接使用该方法,也可以将该方法重写。

④子类如果要重写父类中的方法,则需要在子类的方法前,加一个“override”关键字。⑤子类重写父类的方法必须且只能用“override”关键字

三、静态类以及静态成员
① 调用静态方法的时候必须通过类名直接来调用,不能通过对象来调用,也就是说使用静态成员不需要实例化对象。

②静态成员会在整个应用程序退出时才释放资源,所以可以在整个应用程序中共享数据。

③静态类不能被实例化,不能被继承,不能实现任何接口。

④由于静态成员在整个程序退出时,才释放资源,所以尽量避免写静态字段或静态属性,最好只写静态方法。

⑤当给一个普通类添加静态字段后,系统默认为该类生成一个静态构造函数【静态构造函数不能有访问修饰符、并且也不能带参数】

⑥静态类的构造函数,只会在第一次使用静态类之前,执行,并且只会执行一次。静态构造函数不能有访问修饰符,不能有参数。

⑦静态类的本质:abstract+sealed
静态类不能被实例化:abstract;
静态类不能被继承:sealed;


⑧何时将一个类标记为静态类?
一般情况下,当这个类是一个工具类,里面都是方法。为了让用户调用的时候方便,不需要实例化对象,这时可以将该类标记为Static类,此时该类中只能包含静态成员,不能包含实例成员。比如:Convert、Math、File、

⑨什么情况下需要在一个普通类中编写一个静态成员,而这个类不能标记为static?
当这个类需要被实例化的时候。如果这个类中有一个成员是所有对象都共享的数据,这时可以将该类中的这个成员标记为静态的,但是这个类还是一个实例类。

四、sealed 密封类,不能被继承。
①sealed关键字,表示不能被继承。

②String类。(密封类).net系统中本身对字符串有很多特殊处理,防止别的类继承后造成混乱。商业问题。

③禁止子类重写父类的方法

五、面对对象三大特性:
①封装:字段封装成属性,多个参数封装为对象,代码封装到一个方法再调用,多个cs文件封装为一个程序集。

②继承:首先是类与类间的关系。多个类之间具有共同的特性,把这些共同的特性放到一个父类中,需要这些特性时直接继承这个父类就搞定了。
继承的好处就是:代码的重用,并实现多态。

③多态:通过继承实现的不同对象调用相同的方法,表现出不同的行为。
父类的变量指针指向子类,调用子类的方法,表现出子类的状态。

六:抽象类(关键字abstract)
①抽象方法(abstract标记)不能有任何方法体.(不能有任何实现) 抽象成员不能是私有的

②抽象成员必须在抽象类中。不能写在一个实例中。

③父类中的抽象成员,子类继承后必须重写(例外:除非子类也是一个抽象类)

④抽象类中可以包含抽象方法、属性、索引器、事件【其实这几个最后都是编译为方法】

⑤抽象类中可以有实例成员,但是抽象成员必须存在于抽象类中

⑥抽象类不能被实例化(它的作用就是让子类继承重写)

⑦抽象类也是有构造函数的,只是不能实例化

七:虚方法与抽象类的使用
①如果父类中的方法有默认的实现,并且父类需要被实例化,这时可以考虑将父类定义为一个普通类,用虚方法实现多态。

②如果父类中的方法没有默认实现,父类也不需要被实例化,则可以将该类定义为抽象类。

八、什么是接口?
①接口就是一种规范,协议,约定好遵守某种规范就可以写通用的代码
定义了一组具有各种功能的方法。(只是一种能力,没有具体实现,像抽象方法,"光说不做 ")
②类不能多继承,所以在某些情况下,只能用接口代替,因为【接口可以多实现】
③接口的主要目的:为了实现多态
④当一个类继承了某个类,并且实现了某些接口的时候,必须要将继承的类写在第一个
⑤当多个类型,都具有某个或某几个功能时(方法),但是这几个类型又分属于不同的系列(这几个类型没有共同的父类,这时就不能用抽象类了)所以这时,为了实现多态就可以考虑把这几个类型共有的方法提取到一个借口中,让这几个类型分别实现该接口

⑥通过显示实现的接口必须申明接口变量去调用,因为被实现的方法变成了private的。所以通过类对象访问不到。

⑦接口中成员不需要写访问修饰符 默认为public

九、使用接口的建议
①面向抽象编程,使用抽象(父类、抽象类、接口)不使用具体。
②"向上转型"
③在编程时:
<1>接口→抽象类→父类→具体类(在定义方法参数、返回值、声明变量的时候能用抽象就不要具体)
<2>能使用接口不用抽象类,能使用抽象类就不用类,能用父类就不用子类
<3>避免定义"体积庞大的接口"、"多功能接口",会造成"接口污染"。只把相关联的一组成员定义到一个接口中(尽量在接口中少定义成员)。单一职责原则
<4>定义多个职责单一的接口(小接口)(组合使用) (例子:印刷术与活字印刷术)

十、枚举
<1>普通枚举中每个值都是互斥的。
<2>枚举中的每个值都有一个对应的数值来表示
<2.1>默认数值是整型int,从0开始,一次递增;
<2.1>可以手动的设置每个枚举对应的整数,设置后依旧是依次递增;
<3>枚举在编译完成后就已经用对应的数值常量来表示了。
<4>默认的枚举都是使用int替代的,但是也可以指定具体的数据类型。
//"枚举:byte"表示,限制类枚举中的数字类型
public enum UserState:byte
{
//一般枚举中的每个值都是互斥的
QMe,
OnLine,
OffLine,
Busy
}
<4>标志枚举:(二进制取与或)
[Flags]//标志枚举,加上这个特性后枚举类型.ToString()返回的就是文字形式,而非数字
例:
[Flags]
public enum GoodPeople
{
高=1,→00001(2的0次方)
富=2,→00010(2的1次方)
美=4,→00100(2的2次方)
白=8,→01000(2的3次方)
帅=16 →10000(2的4次方)
}
//为标志枚举赋值
GoodPeople wdl=GoodPeople .白|GoodPeople .富|GoodPeople .美;
Console.WriteLine(白,富,美);打印出" 白,富,美"

//验证wdl的枚举中是否具有白,这一项
if((wdl&GoodPeople .白)==GoodPeople .白)
{
//说明白
}
else
{
//说明不白
}

十一、结构:
①结构式值类型 类是引用类型
②结构不能继承(值类型 ),但是可以实现接口

十二、类型转换
①隐式转化:字节数小的→字节数大的
byte 1字节
char 2字节
short 2字节
int 4字节
long 8字节
double 8字节
bool 1字节

②值类型均隐式派生自System.ValueType(查看IL)
引用类型派生自System.Object

③引用类型变量的赋值只"复制对对象的引用"。

值类型变量赋值会"拷贝一个副本"。

十三、值类型与引用类型
①对于值类型来说:栈中存储的就是直接使用的数据。
②对于引用类型来说:栈中存储的事堆中对象的地址。
③参数传递的时候:
1>值传递,传递的是栈中保存的数据
2>引用传递,传递的是栈本身的地址

 

 

 

 

转载于:https://www.cnblogs.com/wangdonglin/archive/2013/05/15/3080938.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值