TomHouse - C#编程技术基础
type: channel
link: http://blog.fangsiyuan.top/index.php/category/CSharpFoundation/
description: C#编程技术基础
items: 第十四章结课考试
items: 第十三章综合项目--模拟打斗程序
items: 第十二章文件处理
items: 第十一章调试与异常
items: 第十章集合与泛型
items: 第九章常用类
items: C#第二次大作业
items: 第八章抽象类和接口
items: 第七章面向对象之继承与多态
items: C#中的事件

第十四章结课考试
type: item
date: 2022-06-20T13:47:00+08:00
description: 一、选择题(每小题2分，共20分) 1、C#是一种面向( )的语言。 A.机器 B.过程 C.对象 D.事物 2、在C#中，定义派生类时，指定其基类应使用的语句是( )。 A.Inherits B.: C.Class D.Overrides 3、类的以下特性中，可以用于方便地重用己有的代码和数据的是( )。 A.多态 B.封装 C.继承 D.抽象 4、在Array类中，可以对一维数组中的元素进行排序的方法是( )。 A.Sort() B.Clear() C.Copy() D.int.Parse() 5、将变量从字符串类型转换为数值类型可以使用的类型转换方法是( )。 A.Str() B.Cchar() C.CStr() D.int.Parse() 6、在C#中定义接口时，使用的关键字是( )。 A.interface B.: C.class D.overrides 7、以下说法正确的是( )。 A.接口可以实例化 B.类只能实现一个接口 C.接口的成员都必须是未实现的 D.接口的成员前面可以加访问修饰符 8、下列关于抽象类的说法错误的是( )。 A.抽象类可以实例化 B.抽象类可以包含抽象方法 C.抽象类可以包含抽象属性 D.抽象类可以引用派生类的实例 9.下列关于重载的说法，错误的是( )。 A.方法可以通过指定不同的参数个数重载 B.方法可以通过指定不同的参数类型重载 C.方法可以通过指定不同的参数传递方式重载 D.方法可以通过指定不同的返回值类型重载 10.关于虚方法实现多态，下列说法错误的是( )。 A.定义虚方法使用关键字virtual B.关键字virtual可以与override一起使用 C.虚方法是实现多态的一种应用形式 D.派生类是实现多态的一种应用形式二、简答题(每小题5分，共20分)二、简答题(每小题5分，共20分) l、简述private、protected、public修饰符的作用 答： 2、构造方法的特征和作用 答： 3、简述接口和抽象类的区别。 答： 4、什么是序列化和反序列化？ 答： 三、编码题(每小题20分，共60分)1、编写一个C#应用程序，该程序包括3个类：Monkey类、People类和主类Program类（20分） 要求： (1)Monkey类中有个构造方法：Monkey(String name),并且有个public void Speak()方法，在speak方法中输出“咿咿呀呀......”的信息。 (2)People类是Monkey类的子类，在People类调用Monkey的构造方法，重写方法Speak(),在Speak方法中输出“小样的，不错嘛！会说话了！”的信息。 (3)在People类中新增方法void Think(),在Think方法中输出“别说话！认真思考！”的信息。 (4)在主类Program的Main方法中创建Monkey与People类的对象类测试这2个类的功能。 2、接口和抽象类(20) 汽车租赁公司，出租汽车种类有客车、货车和皮卡三种，每辆汽车除了具有编号、名称、租金三个基本属性之外，客车有载客量，货车有载货量，皮卡则具有载客量和载货量。 实现思路： l)需要定义两个接口，一个抽象类car,三个类：PassengerCar、Truck、Pickup.. 2)抽象类汽车Car:属性有：编号No,名称：Name,租金Rent 3)接口A:定义载货量方法ZaiHuoMethod() 4)接口B:定义载客量方法ZaiKeMethod() 5)子类客车PassengerCar继承汽车租赁公司Car,特有属性：载客量ZaiKe。继承接口B. 6)子类货车Truck继承汽车租赁公司Car,特有属性：载客量ZaiHuo。继承接口A. 7)子类货车Pickup继承汽车租赁公司Car,特有属性：载客量ZaiKe。载客量ZaiHuo.继承接口A和B. 8)在主函数中分别实例化三种汽车，并输出汽车的相关信息。 3、编一个程序，定义类Student和它的成员(私有字段、属性和方法)（学号，姓名，年龄、成绩、和输出个人所有信息的方法），用类Student生成三个对象s1,s2,s3,给对象s1,s2,s3的成员赋值后，将对象添加到泛型List<Student>中，通过foreach循环遍历输出对象的所有信息。(20分)

第十三章综合项目--模拟打斗程序
type: item
date: 2022-06-18T20:58:00+08:00
description: 第十三章综合项目--模拟打斗程序初级项目1.任务编号：2.任务名称：模拟一个打斗程序3.任务所属课程名称：类的定义、常用类、封装4.任务难度：C-简单5.任务描述：1)编写一个控制台程序，实现一个简单的战斗程序。 2)首先定义一个基类英雄(Hero) 属性：(名字Name、血量HP、蓝量MP,基础伤害下限BaseHurtLow,基础伤害上限BaseHurtHigh,基础防御下限BaseDefenseLow,基础防御上限Base DefenseHigh) 构造方法：默认属性：血量1000，蓝量800，基础伤害下限100，基础伤害上限300，基础防御下限0，基础防御上限100 方法：基础攻击Attack())基础防御Defense() 攻击伤害=攻击下限到攻击上限的一个随机值，攻击伤害应减去被攻击者的防御值 3)定义一个打斗(Battle)类，用于控制交战。 类中包涵有一个方法FightGo(Hero a,Hero b),主要作用是：a先开始攻击b一下，然后b攻击a一下，互相来回攻击直至某个对象生命值为0为止，每次攻击对方可以选择 基础攻击还是技能攻击，扣除的生命值是在自己Attacklow和AttackHigh之间取一个随机值。方法中显示每次来回打斗的信息，包括对方英雄名字，扣除的生命值及剩余 的生命值等。 在main方法中定义2个英雄Hero对象，执行FightGo方法，来完成一次战斗过程。6.提示 产生随机数可以参考Random类， 攻击进度控制System.Threading.Thread.Sleep(1000);/休眠1秒参考代码-初级先定义一个Hero类{hide}using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Lesson13_1 { //首先定义一个基类英雄（Hero) /// /// 英雄类 /// class Hero { //属性:(名字Name、血量HP、蓝量MP,基础伤害下限BaseHurtLow,基础伤害上限BaswHurtHigh,基础防御下限BaseDefenseLow,基础防御上限BaseDefenseHigh) public string Name { get; set; } public int HP { get; set; } public int MP { get; set; } public int BaseHurtLow { get; set; } public int BaseHurtHigh { get; set; } public int BaseDefenseLow { get; set; } public int BaseDefenseHigh { get; set; } //默认属性：血量1000，蓝量800，基础伤害下限100，基础伤害上限300，基础防御下限0，基础防御上限100 public Hero(string Name) { this.Name = Name; this.HP = 1000; this.MP = 800; this.BaseHurtLow = 100; this.BaseHurtHigh = 300; this.BaseDefenseLow = 0; this.BaseDefenseHigh = 100; } /// /// 基础攻击 /// /// 攻击对象 public int Attack(Hero other) { Random rd = new Random(); //攻击伤害=攻击下限到攻击上限的一个随机值，攻击伤害应该减去被攻击者的防御值 int attackHurt = rd.Next(BaseHurtLow, BaseHurtHigh); return attackHurt - other.Denfense(); } /// /// 基础防御 /// /// <returns>英雄的防御值</returns> public int Denfense() { Random rd = new Random(); return rd.Next(BaseDefenseLow, BaseDefenseHigh); } } } {/hide}再定义一个Battle类{hide}using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Lesson13…

第十二章文件处理
type: item
date: 2022-06-15T15:25:00+08:00
description: 第十二章文件处理目标了解System.IO命名空间文件和目录的常用操作方法使用文件流读写文本文件使用文件流读写二进制文件掌握打开文件、保存文件对话框的使用序列化和反序列化System.IO命名空间对文件操作System.lo命名空间操作各种流类数据System.Text命名空间关于字符编码的类File类文件操作静态类方法描述Create(string filePath)在指定路径下创建指定名称的文件Copy(string sourceFile,string desFile)按指定路径将源文件中的内容复制到目标文件中，如果目标文件不存在将新建目标文件Delete(string filePath)删除指定路径的文件Exists(string filePath)验证指定路径的文件是否存在Move(string sourceFile,string desFile)将指定文件移动到一个新的路径实例using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.IO;//读写文件流操作 namespace Lesson12_1 { class Program { static void Main(string[] args) { //File类内包含用于处理文件的静态方法 if (!File.Exists(@"D:\aa.txt")) { File.Create(@"D:\aa.txt"); } else { File.Copy(@"D:\aa.txt", @"D:\bb.txt"); } File.Delete(@"D:\aa.txt"); } } }using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.IO; namespace Lesson12_2 { class Program { static void Main(string[] args) { //Directory类包含了处理目录的静态方法 Directory.CreateDirectory("@D:/测试目录"); } } }Directory类目录（文件夹）操作静态类方法描述CreateDirectory(string path)创建目录Dele(string path[,bool recursive])删除指定的目录，如果第二个参数为true则同时删除该目录下的所有文件和子目录Exists(string path)测试目录是否存在GetCurrentDirectory()获得应用程序的当前工作目录GetDirectories(string path)返回代表子目录的字符串数组GetFiles(string path)以字符串数组形式返回指定目录中的文件的名称Move(string sourcePath,string desPath)将目录及其内容移到指定的新位置读写文本文件文件流FileStream构造方法FileStream(filePath,FileMode,[FileAccess],[FileShare])filePath是string类型其余3个是枚举类流读取对象StreamWriter类流写入对象Write()WriteLine()Close()StreamReader类流读取对象ReadLine()ReadToEnd()Close()方法二进制文件的读写BinaryReader类BinaryWriter类实例using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.IO; namespace Lesson12_3 { class Program { static void Main(string[] args) { //1、 FileStream fs = new FileStream(@"D:\二进制.data",FileMode.Create); //2、二进制写入对象 BinaryWriter bw = new BinaryWriter(fs); //3、写入二进制文件 for (int i = 0; i < 10; i++) { bw.Write(i); } C…

第十一章调试与异常
type: item
date: 2022-06-13T19:26:00+08:00
description: 第十一章调试与异常目标理解如何调试应用程序和排除错误掌握如何测试C#应用程序在程序中进行错误捕获和错误处理调试必要性在不熟应用程序前必须先对其进行调试在事物处理过程中，系统显示错误信息错误类型语法错误逻辑错误运行时错误调试过程观察程序运行时行为跟踪变量的值确定语义错误的位置VS中的操作步骤合理设置断点鼠标右键F9运行DebugF5F10单步执行VS.NET调试工具“局部变量”窗口“监视”窗口“即时”窗口“快速监视”窗口异常C#中的异常处理语句异常是由try语句来处理的try语句提供了一种机制来捕捉块执行过程中发生的异常C提供了3种异常处理结构：try-catchtry-catch-finallytry-finallytry块：try块监视可能抛出异常的语句。 try { //statements that may cause an exception }·try块管理包含在它内部的语句，定义与它相关的异常处理程序的范围。·try块必须至少有一个catch块。C#引发异常有以下两种方式使用显式throwi语句来引发异常控制权无条件转到处理异常的部分代码使用语句或表达式在执行过程中激发了某个异常的条件，使得操作无法正常结束，从而引发异常Try......Catch......Finally I/O设备异常 try { //程序代码 } catch(IOException E) { //错误处理代码 }System.Exception可以是系统中任何一种异常Try/catch/finally异常Catch可以多重Finally块一般清理内存用Try块中最后执行System.Exception属性含义Message描述当前异常对象的字符串Source引必当前异常对象的程序或对象名称StackTrace发异常时调用堆栈上的帧的字符串表示InnerException表示引发当前异常的内部异常对象常用异常类ArithmeticException数学运算、类型转换异常类InvalidCastException不正确转型异常。例如String转Decimal操作。IndexOutOfRangeException数组访问越界异常。NullReferenceException空引用对象异常。实例using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Collections; namespace Lesson11_2 { class Program { static void Main(string[] args) { ArrayList list = new ArrayList(); try { //程序尝试执行的代码 list.Add(0); list.Add(1); list.Add("2"); list.Add(3); list.Add(4); Console.WriteLine(list[7]); foreach (int item in list) { Console.WriteLine(item); } } catch (IndexOutOfRangeException indexOut)//下标越界异常 { Console.WriteLine(indexOut.Message); } catch (Exception ex)//想要捕获的异常类型 { //错误处理代码 Console.WriteLine(ex.Message);//输出异常的信息 } finally { //不管有没有出现异常或者异常有没有被处理，都会最终执行的代码 Console.WriteLine("程序终止！"); } } } }Throw语句自定义异常当开发人员需要提供更为广泛的信息，或需要程序具有特殊功能时，就可以定义自定义异常。首先要创建一个自定义异常类，该类必须直接或间接派生自System.ApplicationException。using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Lesson11_3 { /// /// 除数不能为0为异常 /// class MyCustomException:ApplicationException { public MyCustomException() { } public MyCustomException(str…

第十章集合与泛型
type: item
date: 2022-06-12T10:23:00+08:00
description: 第十章集合与泛型目标使用System.Array操作数组集合使用System.ArrayListi对象使用System.Hashtable对象理解泛型集合类List对象掌握Dictionary<TKey,TValue>掌握Lambda表达式IComparable接口的应用泛型接口IComparable接☐IComparer接口{dotted startColor="#ff6c6c" endColor="#1989fa"/}System.Array抽象的基类提供Createlnstance方法创建数组可以是多维的下标可设置System.Array的属性和方法属性描述Length得到数组所有维元素总个数的属性实例方法描述Copyto()将一个一维数组中的所有元素复制到另一个一维数组中GetLength()返回指定维的元素个数GetVaule通过索引返回指定元素的值SetVaule将数组中的指定元素设为指定值静态方法描述BinarySearch()使用二进制搜索方法搜索一维已排序数组中的某个值Clear()将数组中一组元素设为0或nullCopy()将数组中的一部分元素复制到另一个数组中CreateInstance()初始化Array类的实例Indexof()返回给定值在一维数组中首次出现的位置索引Last Indexof()返回给定值在一维数组中最后一次出现的位置索引Reverse()反转给定一维数组中元素的顺序Resize()将数组的大小更改为指定的新大小Sort()将数组中的元素进行排序，只能对一维数组从小到大排序实例 static void Main(string[] args) { //系统类可以按F12看定义 //用Array(抽象类)创建数组 Array arr = Array.CreateInstance(typeof(int),5);//创建int类型长度为5的数组 arr.SetValue(89, 0);//为数组元素设置值 arr.SetValue(95, 1); Console.WriteLine(arr.Length); foreach (int item in arr) { Console.WriteLine(item); } for (int i = 0; i < arr.Length; i++) { Console.WriteLine("数组中第{0}个元素是：{1}",i+1,arr.GetValue(i)); } }{dotted startColor="#ff6c6c" endColor="#1989fa"/}集合System.Collectionsi命名空间ArrayList类Hashtable类集合-ArrayList类容量可以根据需要动态扩展。通过设置ArrayList..Capacityl的值可以执行重新分配内存和复制元素等操作批量操作提供的方法在某个时间追加、插入或移出一组元素一维下标不可设置实例 static void Main(string[] args) { //实例化一个集合 ArrayList list = new ArrayList(4); list.Add(10); list.Add("FSY"); list.Add(101.101); People pl = new People(); list.Add(pl); foreach (var item in list) { Console.WriteLine(item); } list.Add("1"); //移除集合中的元素，集合容量不变 list.Remove(10); //如果添加元素时添加的个数大于容量时，容量会自动增加一倍 Console.WriteLine("集合的个数是"+list.Count); Console.WriteLine("集合的容量是"+list.Capacity); //将集合容量设置为集合的实际个数 list.TrimToSize(); Console.WriteLine("集合的个数是" + list.Count); Console.WriteLine("集合的容量是" + list.Capacity); }集合-Hashtable类将数据作为一组键值对来存储键索引器不可重复属性描述Count该属性用于获取哈希表中键值对的数量方法描述Add()将一个键值对添加到哈希表中ContainKey()测试键是否已经存在Remove()根据键将对应的键值对从哈希表移除实例 static void Main(string[] args) { Hashtable ht = new Hashtable(); ht.Add(1,"FSY"); ht.Add(2, "ZLY"); ht.Add("FSY", …

第九章常用类
type: item
date: 2022-06-09T09:48:00+08:00
description: 第九章常用类目标{dotted startColor="#ff6c6c" endColor="#1989fa"/}Math类为三角函数、对数函数和其他通用数学函数提供常数和静态方法对数字变量提供操作方法系统类，只需会操作 class Program { static void Main(string[] args) { //Math类是一个静态类 Console.WriteLine(Math.PI);//圆周率 Console.WriteLine(Math.Abs(-2));//返回自然数的绝对值 Console.WriteLine(Math.Acos(0.5));//返回余弦值为指定数字的角度（单位为弧度） Console.WriteLine(180*Math.Acos(0.5)/Math.PI);//返回余弦值为指定数字的角度 Console.WriteLine(Math.Floor(6.7));//对小数向下取整 Console.WriteLine(Math.Round(6.7));//返回四舍五入的值 Console.WriteLine(Math.Sqrt(9));//返回指定数的平方根 Console.WriteLine(Math.Pow(3, 2));//求一个数的指定次幂 } }{dotted startColor="#ff6c6c" endColor="#1989fa"/}Random类命名空间：System伪随机生成器伪随机数是以相同的概率从一组有限的数字中选取的。所选数字并不具有完全的随机性，因为它们是一种确定的数学算法选择的，但是从实用的角度而言，其随机程度已经够用。class Program { static void Main(string[] args) { //Random类是用来产生随机数的一个系统类 // 第一种实例化 Random rd = new Random(); Console.WriteLine(rd.Next());//返回一个随机数 Console.WriteLine(rd.Next(10));//返回一个指定最大值的随机数 Console.WriteLine(rd.Next(100,200));//返回一个指定范围的随机数 //第二种实例化 Random rd2 = new Random(6); for (int i = 0; i < 10; i++) { Console.Write(rd2.Next(100,200)+" "); } } }{dotted startColor="#ff6c6c" endColor="#1989fa"/}DateTime类一个结构体，它表示时间上的一刻，通常以日期和当天的时间表示构造函数Datetime静态属性NowToday static void Main(string[] args) { //DateTime是表示时间的结构体 Console.WriteLine(DateTime.IsLeapYear(2024)); //年份是否是闰年 Console.WriteLine(DateTime.Now);//获取此计算机上的当前时间 Console.WriteLine(DateTime.Now.AddYears(3));//在当前时间的基础上加上相应的日期 Console.WriteLine(DateTime.Today);//获取此计算机上的当前日期，时间为0 Console.WriteLine(DateTime.Today.ToLongDateString());//获取此计算机上的当前日期 Console.WriteLine(DateTime.Today.ToShortDateString());//获取此计算机上的当前日期 Console.WriteLine(DateTime.Now.ToLongTimeString());//获取此计算机上的当前时间，时分秒 Console.WriteLine(DateTime.Now.ToShortTimeString());//获取此计算机上的当前时间，时分 Console.WriteLine(DateTime.Now.ToString());//获取此计算机上的当前时间 Console.WriteLine(DateTime.Now.ToString());//获取当地的时间 }{dotted startColor="#ff6c6c" endColor="#1989fa"/}String类和StringBUilder类System.String类具有不变性和string关键字对应可以使用“+”连接多个字符串可以使用索引器提取字符频繁的插入、删除或替换操作就会明显的降低性能StringBuilde…

C#第二次大作业
type: item
date: 2022-06-09T09:43:00+08:00
description: 一、选择题(每空2分，共10分)1、下列选项中，（ ）是引用类型。 A.enum类型 B.struct类型 C.string类型 D.int类型 2、下列描述错误的是（ ） A.类不可以多重继承而接口可以； B.抽象类自身可以定义成员而接口不可以： C.抽象类和接口都不能被实例化： D.一个类可以有多个基类和多个基接口： 3、下列关于C#中索引器理解正确的是（ ） A.索引器的参数必须是两个或两个以上 B.索引器的参数类型必须是整数型 C.索引器没有名字 D.以上皆非 4、下列关于构造函数的描述正确的是（ ） A.构造函数可以声明返回类型。 B.构造函数不可以用private修饰 C.构造函数必须与类名相同 D.构造函数不能带参数 5、接口是一种引用类型，在接口中可以声明（ ），但不可以声明公有的域或私有的成员变量 A.方法、属性、索引器和事件： B.方法、属性信息、属性； C.索引器和字段； D.事件和字段：二、填空题(每空2分，共20分)1、C#的数据类型有值类型和_________________。 2、面向对象是一种新兴的程序设计方法，面向对象的基本特征有_________________、_________________、_________________。 3、构造函数在_________________时被调用。 4、类是一种数据结构，它使用_________________关健字声明。 5、类声明后，可以创建类的实例，创建类的实例要使用_________________关键字。 6、一个接口定义一个协定。实现接口的类或结构必须遵守其协定。接口的声明格式为：_________________。 7、抽象类是一种不能直接创建对象的类，通常是部分实现的或者完全不实现。抽象类使用关键字_________________来声明。 8、创建新对象时将调用类的_________________。它主要用来为对象分配存储空间，完成初始化操作。三、编程题(共70分) 1、编写一个接口ITest,,包含两个方法GetArea()和GetZC(),分别用来求圆的面积和周长 定义一个类Circle来实现接口Test里面的方法，分别输出圆的面积和周长，并声明一个double数据类型的字段半径R,写一个有参的构造方法用来初始化半径R,（要求必须写无参构造方法） 在Program类里面初始化一个对象cir来分别调用求周长和面积的方法（30分） (接口10分，类的构造方法5分，继承5分，方法的实现10分，主入口测试5分） 2、创建Calculate基类，其中包含两个整型的protected成员，用以接收用户输入的两个整数。定义一个DisplayResult()虚方法，计算并显示结果 定义四个类(One、Two、Three、Four)派生自Calculate类，分别重写DisplayResult()虚方法，分别实现两个整数的加、减、乘、除运算并输出结果 实例化四个对象，分别调用四个类里面的方法实现加、减、乘、除(40分) (基类中protected成员4分，虚方法6分：派生类20分，每个5分：实例化四个对象并调用方法实现加减乘除10分）

第八章抽象类和接口
type: item
date: 2022-06-07T21:27:00+08:00
description: 第八章抽象类和接口目标{dotted startColor="#ff6c6c" endColor="#1989fa"/}抽象类和抽象方法用来列举一个类所需要的行为不明确提高具体实现方法必须有其子类实现它的抽象方法抽象方法·只指明方法的返回值类型、方法名称及参数，而不提供方法的实现。抽象类语法[访问修饰符]abstract class类名 { 代码 }抽象类案例 abstract class People//抽象类 { string name; string sex; public string Name { get => name; set => name = value; }//字段封装 public string Sex { get => sex; set => sex = value; }//字段封装 /*public virtual void Speak() { Console.WriteLine("大家好，我是一个人"); }*/ public abstract void Speak();//把Speak定义为抽象方法，使用关键字abstract }抽象类特性抽象类不能实例化抽象类可以包含抽象方法和抽象访问器不能用sealed修饰符修改抽象类，这意味着抽象类不能被继承从抽象类派生的非抽象类必须包括继承的所有抽象方法和抽象访问器的实现抽象类里面只有方法的声明，没有方法的主体抽象方法不能是静态的，不能用static抽象方法不能标记为virtual抽象类注意事项注意：(1)抽象方法只能在派生类中才能真正实现(2)一个类中只要有一个抽象方法，该类必须定义为抽象类(3)抽象方法只指明返回值类型、方法名称及参数(4)定义成抽象方法的目的在于指定派生类必须实现这一方法的功能(5)抽象类可以有构造方法，但是构造方法不能直接被调用而只能由派生类的构造方法调用虚方法和抽象方法虚方法抽象方法用virtual修饰用abstract修饰要有方法体，哪怕是一个分号不允许有方法体可以被子类override必须被子类override除了密封类都可以写只能在抽象类中{dotted startColor="#ff6c6c" endColor="#1989fa"/}接口全部是为实现的方法语法[属性][修饰符]interface 接口名 { //接口主体 }接口中只能声明方法、属性、索引器和事件接口不能声明字段、构造方法、常量和委托接口的成员默认是public的，如果明确指定成员的访问级别会报编译错误接口中所有的方法、属性和索引器都必须没有实现C#中的接口以大写字母“I”开头接口定义内容//定义接口，定义后不需要改变，需要不同功能，继承时扩展即可 interface IPrint { void Print(); //只定义，不实现 //IPerson(); //错误，未写返回值 //string name; //错误,定义字段 //public void GetlDcard(); //错误，指定访问级别 //void GetName(); //正确 //void GetAge(string s); //正确 //int GetHeight(); //正确 }使用接口类实现接口与继承一样，需要使用冒号运算符与抽象类不同的是，类是实现了接口中的方法而不是重写，所以实现接口的方法时不需要override关键字。//A继承接口 class A IPrint { //实现接口方法，必须有，//当然还可以再添加其它的字段、属性、方法 public void Print() { System.Console.WriteLine("A"); } } //B继承接口 class B:IPrint { public void Print() { System.Console.WriteLine("B"); } }using System.Collections.Generic; using System.Text; using System.Threading; namespace AppTest { class Demo interface { static void Main(string[]args) { //使用(注意，这里是使用接口IPirnt,下面是不同的实例，获得不同功能) IPrint I; I=new A();//实例化A,将打印出A I.Print(); I=new B();//实例化B,将打印出B I.Print(); Thread.Sleep(3*1000);//暂停3秒，看打印结果 } } }思考写的不错，不过这个例子还缺少一部分，人家可以说我可以在基类上定义Print(),PrintPreview()2个虚函数，让后续不同打机的类继承这个基类，ov…

第七章面向对象之继承与多态
type: item
date: 2022-06-06T20:37:00+08:00
description: 继承的基本概念继承中的构造方法密封类多态重载（见第四章第四节）同一类中方法名相同参数不同重写子类中对父类的方法进行修改或者重新编写父类的对象可以指向子类的实例，并且调用子类重写重写的步骤在父类中把某个方法定义为虚方法，使用virtual关键字 class People { public virtual void Speak() { Console.WriteLine("大家好！我是一个人！"); } }在子类中使用override关键字重写父类的虚方法 class Student:People//继承 { public override void Speak() { Console.WriteLine("大家好，我是一名学生，我叫{0},性别{1},年龄{2}",name,sex,age); } }总结继承子类可以继承父类的非私有成员。不能继承父类的构造方法，子类构造方法会自动调用父类构造方法，并且父类构造方法先执行，再执行子类构造方法。使用 base关键字显示调用父类构造方法。base关键字还可以访问父类成员。protectedi访问修饰符修饰的成员可以被子类和本身访问，其他类访问不了。密封类sealed关键字修饰的类，表示不能被其他类继承。多态是指二个或多个不同的类，对同一方法的不同代码实现。virtual、override关键字，子类重写父类的虚方法。父类对象可以引用子类实例，并且调用子类重写的方法。

C#中的事件
type: item
date: 2022-06-02T16:29:00+08:00
description: 事件使用的步骤定义委托定义事件 [访问修饰符] event 委托名 事件名订阅事件 事件名 +=new 委托(事件处理方法名);引发事件 事件名([参数列表]);定义引发事件方法定义事件处理程序触发事件