1:面向对象多态之虚方法(让一个对象表现出多个状态):在基类中用virtual标识方法,
在派生类中用override来覆盖同名的方法。
面向对象多态之抽象类:
当父类中的方法不知道该如何实现的时候,可以考虑将父类写成抽象类,将父类中的方法写成抽象方法。
抽象函数没有方法体。之所以用抽象函数,是因为我们不知道该如何去写这个抽象方法或者说,
这个抽象方法如果真去实现的话根本没有意义;如果能写出抽象方法的方法体的话,我们就不把它写成
抽象方法了,而是写成虚方法。(抽象方法存在的意义就是让子类去重写这个方法)
2:
抽象类特点:
1)、抽象成员必须标记为abstract,并且不能有任何实现。
2)、抽象成员必须在抽象类中。
3)、抽象类不能被实例化
4)、子类继承抽象类后,必须把父类中的所有抽象成员都重写。
(除非子类也是一个抽象类,则可以不重写)
5)、抽象成员的访问修饰符不能是private
6.)、在抽象类中可以包含实例成员。
并且抽象类的实例成员可以不被子类实现
7)、抽象类是有构造函数的。虽然不能被实例化。
8)、如果父类的抽象方法中有参数,那么。继承这个抽象父类的子类在重写父类的方法的时候必须传入对应的参数。
如果抽象父类的抽象方法中有返回值,那么子类在重写这个抽象方法的时候 也必须要传入返回值。
======
如果父类中的方法有默认的实现,并且父类需要被实例化,这时可以考虑将父类定义成一个普通类,用虚方法来实现多态。
如果父类中的方法没有默认实现,父类也不需要被实例化,则可以将该类定义为抽象类。
3:
接口中的成员(方法、属性、索引器)不允许写访问修饰符,默认就是public。
接口的成员不能有定义,也就是说,接口里的方法是只能声明,不能写方法体。(有点类似抽象函数)
接口是一种规范,一旦你继承了某个接口,就要实现其中的成员。
接口、静态类、抽象类都不能被实例化!!
接口与接口之间可以继承,并且可以多继承。(而’类‘不能)
接口可以继承接口,但是不能继承类。
一个类继承一个类和多个接口,语法上必须把类写在前面。
显示实现接口就是为了解决方法的重名问题。
GUID可以帮我们产生一个全世界不重复的编号。Guid.NewGuid();
4:
访问修饰符
public:公有的
private:私有的,只能在当前类的内部可以访问
protected:受保护的,只能在当前类的内部以及该类的子类中可以访问
internal:内部的,只能在当前的项目中可以访问,在同一个项目中public和internal的访问权限是一样的。
protected internal: protected+internal
能够修饰类的访问修饰符只有public和internal。(默认类的访问修饰符是internal)
可访问性不一致:子类的访问权限不能高于父类,否则会暴露父类的成员。
设计模式(23种):开发项目的一种方式。
5:序列化: 将对象转换为二进制
反序列化:将二进制转换为对象
作用:传输数据
要序列化某个对象,必须先将这个对象对应的类标记为可序列化的。[Serializable]
部分类:partial
在同一个命名空间下,有的时候为了开发方便,可以有相同的(部分)类。
密封类:sealed(不能被继承,但是可以继承别人)
6:任何对象都可以调用ToString()方法,而object这个类又是所有类的父类,
所以说,ToString()方法是object中的方法,并且是虚方法,在子类中可以重写它。
7:MD5加密
MD5这个抽象类在using.System.Security.Cryptography这个命名空间下,通过MD5 md5=MD5.Create();
来创建一个MD5对象,再调用md5.ComputeHash(buffer);就将字节数组buffer转换为加密后的字节数组了,
最后将字节数组转换为字符串输入就OK了。
将字节数组转换为字符串有几种方式:
1)、将字节数组中的每一个元素按照指定的编码格式进行解析;
2)、将字节数组中的每一个元素ToString(),然后连接起来就OK了;
3)、直接将字节数组ToString(),这样肯定是不行的,得到的是字节数组所在的命名空间。
8:winform应用程序是一种智能客户端技术,我们可以使用winforn应用程序帮助我们
获得信息或者传输信息等。
9:属性
Name:在后台要获得其那台的空间对象;
Visible:指示一个控件是否可见;
Enable:指示一个控件是否可用;
获取焦点:Focus();
10、事件:发生一件事情。
注册事件:
触发事件:
11、在Mian函数中创建的窗体对象,我们称之为这个窗体应用程序的主窗体。,
也就意味着,当你将主窗体关闭后,整个应用程序都关闭了。
12:
Click:当点击按钮时的点击事件。
Load:当窗体被加载时发生的事件。
MouseEnter:当鼠标进入控件的可见部分时发生。
13、TextBox文本框控件:
WordWrap:指示文本框是否换行;
PassWordChar:让文本框显示单一的字符;
ScollBars:是否显示滚动字条;
默认的事件是TextChanged:在控件上更改Text属性的值时引发的事件。
label标签控件就是用来显示文本的。
14:跑马灯练习
string str="abcde";
//前提是下面的类似代码要在一个Timer计时器下执行;
str=str.Substring(1)+str.Substring(0,1);
15:单选:RadioButton
多选:CheckBox
容器:GroupBox
16:MDI窗体设计:
1)、首先确定一个父窗体,将IsMdiContainer设置为true;
2)、创建子窗体,并设置它们的父窗体。
在父窗体中横向排列子窗体(横向排列的Click事件):LayoutMdi(MdiLayout.TileHorizontal);
在父窗体中纵向排列子窗体(纵向排列的Click事件): LayoutMdi(MdiLayout.TileVertical);
17:
File:操作文件
Path:操作路径
FileStream:文件流
StreamReader:操作文本文件
StreamWriter:同上
Directory:操作文件夹 目录
18:Directory 操作文件夹的
Directory.CreatDirectory();在指定路径下创建文件夹
Directory.Delete();删除指定文件夹下的文件夹
Directory.Move();剪切文件夹,但是只能在同一盘中进行
Directory.Exists();判断指定路径下的文件夹是否存在
Directory.GetFiles();获得指定文件夹下的所有文件的全路径
Directory.GetDirectory();获得指定那个文件夹下的所有文件夹的全路径
19:webBrowser浏览器控件
url
20:ComboBox下拉框控件
DropDownStyle:控制下拉框的外观和样式
ListBox列表框(类似于KuGou的音乐列表):
要获取列表中某个元素的下标可以这么来:int n=listbox.SelectedIndex;(当创建列表中文件的双击
事件时,非常有用)。
21:打开对话框
OpenFileDialog ofd=new openFileDialog(); //创建对话框对象
ofd.Title="****"; //设置对话框的标题
ofd.Multiselecte=true; //设置对话框是(否)可以多选
ofd.InitialDirectory=@"路径"; //设置对话框的初始目录
//设置对话框打开文件的类型
ofd.Filter="文本文件|*.txt|视频文件|*.wav|图片文件|*.jpg|所有文件|*.*";
ofd.ShoewDialog(); //显示对话框
string fileName=ofd.FileName; //获得对话框中文件的路径;
22:保存对话框(类似于打开对话框)
SaveFileDialog sfd=new SaveFileDialog(); //创建保存对话框对象
sfd.Title="标题名"; //设置对话框的标题
sfd.InitialDirectory="路径"; //设置对话框的初始目录
//设置对话框保存文件的格式
sfd.Filter="文本文件|*.txt|所有文件|*.*";
sfd.ShowDialog(); //打开保存对话框
23:字体和颜色的设置(设置文本文件中文本的字体和颜色)
FontDialog fd=new FontDialog();
fd.ShowDialog();
txtWord.Font=fd.Font; //设置文本中的字体
ColorDialog cd=new ColorDialog();
cd.ShowDialog();
cd.ForeColor=txtWord.Color; //设置文本的颜色
24:进程和线程
单线程在处理问题时容易出现卡死,而多线程可以让计算机同时做多件事情,提高效率。
表示进程的类:Process
表示线程的类:Thread
线程分为:前台线程和后台线程
后台线程:前台线程关了,我这个后台线程也就关闭了。
25:在.Net中是不允许跨线程操作的。
26:取消跨线程的访问(窗体加载时写上-->):Control.CheckForIllegalCrossThreadCalls = false;
27:Net的公共语言进行时(CLR)能区分两种不同类型的线程:前台线程和后台线程。这两者的区别就是:
应用程序必须运行完所有的前台线程才可以退出;而对于后台线程则可以不考虑其是否已经运行完毕而
直接退出,所有的后台线程在应用程序退出时都会自动结束。
一个线程是前台线程还是后台线程可以由它的IsBackGround属性来决定,这个属性是可读可写的。它的
默认值是False,即意味着一个线程默认为前台线程。我们可以将它的IsBackGround属性设置为true,从
而使之为一个后台线程。
28:如果线程在执行过程中需要参数,那么要求这个参数必须是object类型。并且这个参数只能传递
到th.Start(参数)方法中。
29:GDI+ 画图的东东
画直线需要:画笔 画笔的颜色 画图的对象 两个点
Graphics g=this.createGraphics(); //Graphics 没有构造函数,不能直接new出来对象
Pen pen=new Pen(Brushes.颜色);
Point p1=new Point(10,10);
Point p2=new Point(100,100);
g.DrawLine(pen ,p1,p2);
由于我们在拖动窗体的时候,系统在不停的给我们重新绘制当前窗体。而窗体内的图像可能会被擦去,
因此,我们会创建一个窗体移动时的Paint事件,让窗体只要一移动就重新绘制我们需要画的图型。