C#2

面向对象的三大特性:封装、继承、多态。

封装:把变化的东西封装起来,保留对用户的统一的接口。(属性封装了字段,方法的多个参数可以封装成一个对象,一堆代码封装到方法中,将一些功能封装到类中或者封装到接口中,多个类文件封装成一个exe的程序集)

File.WriteAllText(@“路径”,值);File.ReadAllText(@“路径”);

cboName.Items.Add("值");cboName.SelectedItem表示当前选中项(注意:当前选中项如果是对象那么此时就表示那个对象);

cboName.SelectedValue和cboName.SelectedValue绑定数据源以后才能这么用。

重点:对象初始化器。new一个新对象可以后头加个大括号,在大括号内对属性赋值(直接写属性名就好了不用“对象.属性名”!!!)!!!

对象.ToString():显示了对象的完全限定名称,这里涉及ToString()方法的重写(这里的ToString()是有object继承的虚方法方法)。解决方法在对象对应的类中重写方法:public override String ToString(){ return 属性;}

继承:(子类 is a 父类)
继承的好处:代码重用、多态、LSP里氏替换原则。
继承的特性:~1单根性,一个类同时只能继承自一个父类,不能同时继承多个类!!!!~2传递性(有Object类的方法:Equals(),GetType(),ToString(),GetHashCode())

c#中任何一个类都是继承Object类。如果一个类没有显示继承任何类,则默认继承自Object类。如果显示的指定了当前类继承自某个类,则将覆盖继承的Object类。

重点:构造函数继承中的问题(位置2-5):~1继承的时候,构造函数不能被继承~2调用子类的构造函数的时候(即初始化一个对象的时候)会默认调用父类中的无参数的构造函数。~3 :base()显示的去调用父类的某个构造函数。不写的话默认调用父类无参数的构造函数,如果此时父类没有无参构造函数则报错!!!

区别:base和this:base可以调用父类构造函数(:base())和调用父类对象成员(base.);this可以调用本类的构造函数(:this())和调用当前对象成员(this.)。

重点:在一般情况下,如果子类继承了父类的成员,那么在子类中,通过this.这个成员或者base.这个成员都是访问的是一样的。除非父类中的成员子类继承后又重写了!!!

语法糖:对象初始化器、集合初始化器 

疑问:~1当调用有参构造函数然后后头又有对象初始化器且参数和初始化成员重复而赋的值又不同此时最后是选哪个值(即哪句赋值语句后执行的?)答:先执行构造函数,再执行对象初始化器中的内容。~2用this调用当前类的构造函数,这个时候会调用父类的构造函数吗,是直接调用还是通过调用当前类的构造函数,这个构造函数去调用了父类的构造函数?答:后一种说法正确,即构造函数一定会调用别的构造函数看后头指在那里(由this或者base指向),如果后头没有具体指向则默认指向父类的无参构造函数。

private只能在当前类内部访问,protected只能在当前类内部和所有子类的内部访问,internal只能在当前程序集来访问,public在任何地方都能访问,protected internal 相当于两个权限的并集。

个人观点:继承是面向对象中的概念:能不能继承指的是不能访问,所以我认为私有成员是不能被继承的。继承下来是为了能用能多态,虽然内存中私有成员都存在但是不能的使用,不能多态,所以我认为不能被继承
或者说:私有成员子类不能被继承。原因:~1虽然子类继承父类后,在创建子类对象的时候,父类中的那些私有成员,也被分配了内存(子类中也有)。~2但是,继承只是面向对象中的一个概念,目的是为了子类使用(多态、代码重用),私有成员即便被继承了,子类中也不能访问,所以在面向对象中,继承了但不能访问,没有意义。

重点:访问级别约束:~1子类的访问级别不能比父类的高。(会暴露父类的成员)。~2类中属性或字段的访问级别不能比所对应的类型访问级别高。~3方法的访问级别不能比方法的参数和返回值的访问级别高(注意:方法的访问级别为:方法的访问修饰符且上方法所在类的访问修饰符)。

ctrl+k+d自动缩进对齐

虚方法:是多态的一种表现,是符合开放封闭原则的一种体现(面向对象的原则:对扩展开放,丢修改关闭。),父类方法返回值前加个virtual,子类方法返回值前加override,说然后用父类对象点出的方法表现的是子类的方法!!!子类没有重写的话就表现父类的方法!!!

实现多态的方式:虚方法,抽象类抽象方法,接口。

重点:静态成员、静态类、实例成员:
~1调用静态成员必须通过类名来调用,不能通过对象来调用,也就是说使用静态成员不需要实例化对象。
~2静态变量是在整个运用程序退出后才释放的(尽量避免写静态字段、静态属性,尽量只写静态方法),所以修饰为internal或者public时候他是个全局变量,所以他可以在整个运用程序中共享数据!!!!~3静态类中的所有成员必须都是静态的,非静态类中也可以有静态成员,那么写不写成静态类关键看这个类需不需要实例化(例如等Convert、Console、Math等工具类都是静态类)!!!
~4静态类不能被实例化,不能被继承!!!!!!
~5当给一个普通类添加静态字段后,系统会默认为该类生成一个静态构造函数【静态构造函数不能有访问修饰符、并且也不能带参数】
~6静态类的构造函数,只会在第一次使用静态类之前,执行,并且只会执行一次。
~7普通类的静态构造函数,只会在第一次使用这个类之前,执行,并且只会执行一次。
~8综合5到7有,当有静态成员时就系统就会默认生成一个静态构造函数,且静态构造函数会在第一次使用这个类之前被调用,且只执行一次!当然当普通类没有构造函数时候我们也可以自己写一个静态构造函数,他依旧是会在使用这个类之前被调用,且只执行一次!

重点:静态类总结:
~1什么情况下要将一个类标记为静态类?:一般情况是,当这个类是一个工具类,里面都是方法。为了让用户调用的时候方便,不需要实例化对象,这时候可以将该类标记为static类,此时该类中只能包含静态成员,不能包含实例成员。比如Convert、Math、 File、Console。
~2 什么情况下下需要在一个普通类中编写一个静态成员,而这个类不能标记为static?:当这个类需要被实例化的时候。如果这个类中有一个成员是所有对象都共享的数据,这时可以将该类中的这个类成员标记为静态的,但这个类还是一个是实例类。

重点:sealed加在关键字class前表示密封类,密封类是不能被继承的。sealed加载重写方法关键字override前表示这个重写方法的类的子类不能再重写这个方法了。

重点:类中成员不写访问修饰符的时候默认是private

posted @ 2013-08-18 10:36  黄飘龙  阅读(216)  评论(0编辑  收藏  举报