版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第5章面向对象的高级编程第5章面向对象的高级编程第5章面向对象的高级编程5.1类的继承与多态性封装:隐藏调用者不需要了解的信息;类封装了对象的属性数据以及对这些数据的操作;将对象的表现(服务、接口)和实现细节分开;继承:在类之间建立一种相交的关系;提供了代码的重用性和可扩充性;提高了开发效率;多态:由继承产生,以继承为基础;不同对象对相同消息的不同处理;5.1类的继承与多态性封装:隐藏调用者不需要了解的信息;类封装了对象的属性数据以及对这些数据的操作;将对象的表现(服务、接口)和实现细节分开;继承:在类之间建立一种相交的关系;提供了代码的重用性和可扩充性;提高了开发效率;多态:由继承产生,以继承为基础;不同对象对相同消息的不同处理;5.1类的继承与多态性5.1.1基类和扩充类5.1.2多态性5.1.3抽象类5.1.4密封类5.1.5继承过程中构造函数的处理5.1.1基类和扩充类继承是现实世界中遗传关系的直接模拟。表示类之间的内在联系以及对属性和操作的共享。被继承的类叫基类;
继承自其他类的类叫扩充类;基类也称为父类;扩充类也称为派生类、子类;两种实现继承的方式:类继承:单一继承;接口继承:多重继承;5.1.1基类和扩充类声明扩充类的语法:
[访问修饰符]class
扩充类名称:基类名称
{//程序代码
}扩充类对基类的继承:扩充类继承基类中所定义的数据和方法;不能选择部分成员继承;扩充类可以在继承基类的基础上自定义自己的特有成员;扩充类不能继承的有:基类的构造函数和析构函数;基类的private的成员;【例5-1】基类和扩充类的定义及用法。publicclassAnimal{
publicAnimal(){Console.WriteLine("基类构造函数:Hello,Animal!");}publicvoidEat(){Console.WriteLine("基类方法:Eating");}}publicclassCat:Animal{
publicCat(){Console.WriteLine("扩充类构造函数:Hello,Cat!");}publicvoidWalk(){Console.WriteLine(“扩充类方法:Walk");}}基类和扩充类的练习圆正方形几何图形Shape类字段:color方法:GetColor()
Rectangle类字段:length、width方法:GetArea()GetPerimeter()Circle类字段:radius方法:GetArea()Square类长方形5.1.5继承过程中构造函数的处理(1/2)C#中对扩充类对象的初始化顺序从扩充类依次向上寻找其基类,直到找到最初的基类;从基类开始,依次向下执行基类、扩充类的构造函数,直至执行完最终的扩充类的构造函数为止。默认使用基类的无参构成函数;【例5-1】基类和扩充类的定义及用法。staticvoidMain(string[]args){
Catcat=newCat();
cat.Eat();Console.ReadLine();}运行结果:基类构造函数:Hello,Animal!扩充类构造函数:Hello,Cat!基类方法:Eating若Cat类中包含无参的Eat方法,则默认调用扩充类中的Eat方法。5.1.5继承过程中构造函数的处理(2/2)扩充类对象创建的几种情况使用扩充类的无参构造函数创建对象;基类和扩充类都使用默认的构造函数,不会出错;使用扩充类的有参构造函数创建对象,则系统会自动向上寻找基类的无参构造函数;若基类中使用默认构造函数,则不会出错;若基类中自定义了构造函数,且没有无参的构造函数,则无法找到基类构造函数,编译会报错;解决办法:需要使用base关键字指定使用基类的有参构造函数,并传递参数。base关键字用法1在扩充类中使用base关键字即可指代当前类的基类,调用基类的方法;用法2扩充类的有参构造函数,指定使用基类的有参构造函数,并传送参数至基类,创建扩充类对象;举例:几何图形的例子,正方形构造函数可改写成如下形式:若未使用base关键字,则调用Rectangle类的无参构造函数,必须在Square构造函数中为width和length字段赋值;若使用了base关键字,则可将扩充类的参数传递到基类构造函数中,使用基类带参数的构造函数;publicSquare(stringcolor,doubleside):base(color,side,side){}P88【例5-5】
继承机制中构造函数的用法。类对象的构造顺序初始化数据成员按照声明的顺序,初始化类中的各个数据成员;包括值类型成员和引用类型成员;调用构造函数从最初的基类,依次向下,最终到自身,调用各级构造函数;默认调用无参的构造函数,可使用base关键字指定调用有参的构造函数;构造函数中也可使用之前定义数据成员的方法,但一般只做数据成员的初始化;5.1.2多态性多态性是指对象可以表示多个类型的能力。通过继承实现多态性多个类继承自同一个类,每个扩充类可以重写基类成员,以提供不同的功能。具体方法:课本5.1.2小节中介绍的三种方法扩充类使用重写(override)基类的虚拟方法(virtual);扩充类使用new关键字隐藏基类方法;扩充类中直接调用基类方法;通过抽象类实现多态性(课本5.1.3小节中介绍)扩充类重写基类中的抽象方法;通过接口实现多态性(课本5.3节中介绍)多个类用不同的功能实现接口中定义的方法;①扩充类使用重写基类的虚拟方法特点:基类方法必须使用virtual修饰符;扩充类方法必须使用override修饰符;扩充类对象调用该方法,使用重写后的方法;举例:基类扩充类(1)虚拟方法不能声明为静态的。(2)virtual不能和private一起使用。重写方法的名称、参数个数、类型以及返回值都必须和虚拟方法的一致。
publicvirtualvoidmyMethod(){……//程序代码
}publicoverridevoidmyMethod(){……//程序代码
}//MyClass.csusingSystem;namespaceConsoleTest{classMyClass{publicvirtualvoidHello(){Console.WriteLine("123");}}}//MyNewClass.csusingSystem;namespaceConsoleTest{classMyNewClass:MyClass{privatestringstr="hello";publicoverridevoidHello(){Console.WriteLine(str);}}}虚拟方法与重写举例P83【例5-2】
重写基类的方法。②扩充类使用new关键字隐藏基类方法特点:基类方法不需要任何特殊的修饰符;扩充类方法使用new关键字来隐藏基类的方法;扩充类对象调用该方法时,使用new定义的方法;举例:基类扩充类
public
voidmyMethod(){……//程序代码
}publicnewvoidmyMethod(){……//程序代码
}new方法的名称、参数个数、类型以及返回值都必须和虚拟方法的一致。P84【例5-3】
隐藏基类的方法。③扩充类中直接调用基类方法在扩充类的方法中,使用base关键字调用基类方法;同名方法不加任何特殊的修饰符,编译会有警告,不影响程序执行;使用virtual和override、new修饰符,则无警告;不同名方法直接使用方法名调用基类方法;5.1.3抽象类抽象类声明时,使用abstract修饰符;表示类中的成员不一定全部实现,可以只有声明;抽象方法也需要abstract修饰符,且不需要{}部分;例如:抽象类只能做基类;扩充类要重写(override)实现抽象类中的所有抽象方法;例如:publicabstractclassShape{publicabstractdoubleGetArea();}publicclassCircle:Shape{publicoverridedoubleGetArea();}P85【例5-4】
抽象类和抽象方法的使用。抽象类与非抽象类的区别抽象类抽象类不能直接被实例化,只能在扩充类中通过继承使用;对抽象类使用new运算符会产生编译时错误;抽象类可以包含非抽象成员,也可以包含抽象成员;非抽象类不能包含抽象成员;当从抽象类派生非抽象类时,非抽象类除了继承抽象类的所有非private成员,还必须使用overrid实现抽象类的所有抽象成员。5.1.4密封类密封类不能被其他类继承的类;密封类声明时,使用sealed关键字。sealed关键字也可以防止被扩充类重写基类中的方法;密封方法带有sealed修饰符的方法称为密封方法;密封方法不能被扩充类中的方法继承,也不能被隐藏;密封方法必须同时使用override修饰符,防止派生类中的重写方法进一步被重写;基类方法中使用virtual定义虚方法;扩充类中使用sealedoverride将其重写并密封,禁止其他派生类中重写;5.2版本控制所谓版本控制,即类继承关系中的同名方法的调用;类实例在调用基类与扩充类中同名方法时的选择依据;判定依据:若声明与实例化所用的类相同时,调用声明的类中的方法。若声明与实例化所用的类不同(即声明为基类的对象,初始化为扩充类的实例),调用同名方法时:当基类的方法前有virtual,扩充类的同名方法前有override时,调用扩充类中的方法;其他情况下,调用基类中的方法。调用非虚拟方法时不会受到版本的影响;调用虚拟方法的实现部分可能会因扩充类的重写而影响执行结果。继承关系中的对象声明声明与初始化相同声明的对象具有该类所有的数据和方法;举例:Bb=newB();Aa=newA();声明与初始化不相同声明为基类,用扩充类的构造函数初始化该对象,该对象具有基类的所有成员;举例:Ac=newB();classA{privateinta1;publicinta2;protectedinta3;}classB:A{protectedstrings;publicB(){a2=1;}publicvoidbprint(){}}P89【例5-6】
使用virtual、new与override进行版本控制。读程序写结果publicclassA{publicvoidF(){Console.WriteLine("A.F");}publicvirtualvoidG(){Console.WriteLine("A.G");}}publicclassB:A{publicnewvoidF(){Console.WriteLine("B.F");}publicoverridevoidG(){Console.WriteLine("B.G");}}Main方法中定义:
B
b=newB();Aa=b;以下语句的输出为:
a.F();b.F();a.G();b.G();
A.F
B.F
B.G
B.GC#面试题-读程序写结果publicclassA{publicA(){Console.WriteLine(“A”);}publicvirtualvoidFun(){Console.WriteLine("A.Fun()");}}publicclassB:A{publicB(){Console.WriteLine(“B”);}publicnewvoidFun(){Console.WriteLine("B.Fun()");}publicstaticvoidMain(){Aa=newB();a.Fun();}}输出结果为:ABA.Fun()C#面试题-读程序写结果Main方法中:
A
a=newA();Bb=newB();a.Fun2(b);问输出结果是什么?
2
5publicclassA{publicvirtualvoidFun1(inti)
{Console.WriteLine(i);}publicvoidFun2(Aa)
{
a.Fun1(1);Fun1(5);
}}publicclassB:A{
publicoverridevoidFun1(inti)
{
base.Fun1(i+1);
}}5.3接口接口的主要特点是只有声明部分,没有实现部分;接口成员的实现是通过类完成的;用于多人合作开发项目时,事先约定好相互调用的接口,使项目开发效率提高,也使兼容性问题最小化;接口使用interface关键字声明。常用的语法是:
[访问修饰符]interface
接口名称
{//接口体
}一般情况下,接口名以大写字母“I”开头;接口体只能包含方法、属性、索引器和事件的声明,不能包含字段和构造函数;定义在接口中的方法都是public的,不需要指明修饰符;P91【例5-7】
接口的声明与实现。显式方式实现接口使用情况接口多继承时,不同接口中存在同名方法时使用;注意事项类中显式实现接口中方法时,方法不加访问修饰符;对显式实现的方法进行访问时,必须使用接口实例;接口实例的创建:接口名称实例名=new类构造函数();P92【例5-8】
以显式方式实现接口。接口和抽象类相同点:接口与抽象类都有只声明不实现的部分;某种程度上,接口很像一个抽象类。不同点:接口是完全抽象的成员集合;抽象类可以包含实现部分;类从接口继承时可以实现多继承,但从抽象类继承则只能实现单继承。C#面试题(不定项选择题)(1)以下叙述正确的是:
A.接口中可以有虚方法。
B.一个类可以实现多个接口。C.接口不能被实例化。
D.接口中可以包含已实现的方法。(2)以下叙述正确的是:
A.接口和抽象类一样均只能声明,而不能有实现部分。
B.类可以继承多个接口,但仅能从一个抽象类或其它类型的单个类继承。
C.接口中可以定义属性、方法和事件,但只声明不实现。
D.类的多继承可以通过接口实现。B、CB、C、D5.4委托和事件5.4.1委托5.4.2事件委托的引入(1/3)新建类SayHello方法EnglishHello用于显示英文的问好;方法Hello中调用EnglishHello,显示问好;privatevoidEnglishHello(stringname){
Console.WriteLine("Hello,"+name+".");
}publicvoidHello(stringname){
EnglishHello(name);
}委托的引入(2/3)SayHello类中添加一个中文方法;添加枚举类型Language;publicenumLanguage{Eng,Chin};在方法Hello中添加判断;程序中调用Hello方法;publicvoidHelloChin(stringname){Console.WriteLine("你好,{0}!",
name);}publicvoidHello(stringname,Languagelan){switch(lan){
caseLanguage.Chin:
HelloChin(name);break;
caseLanguage.Eng:
HelloEng(name);break;}}SayHellomyHello=newSayHello();myHello.Hello("张三",
Language.Chinese);myHello.Hello("Tom",
Language.English);委托的引入(3/3)将方法Hello中的Language参数换为方法名委托定义publicdelegatevoidHelloDelegate(stringname);MakeHello作为委托类型(HelloDelegate)的变量;声明委托实例:HelloDelegateMakeHello;委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递优点:可以避免在程序中大量使用if-else(switch)语句,同时使得程序具有更好的可扩展性。publicvoidHello(stringname,***MakeHello){MakeHello(name);}5.4.1委托类似与C++中的函数指针的功能;可以指向静态的方法;还可以指向对象实例的方法。委托的最大特点它不知道或不关心自己引用的对象的类。委托的应用回调(CallBack)机制常见的设计模型,把工作流内的某个功能,按照约定的接口暴露给外部使用者,为外部使用者提供数据,或要求外部使用者提供数据。事件处理在委托基础上的封装应用;委托的声明和使用委托的声明语法访问修饰符delegate
返回类型委托名(参数列表);委托定义时,没有方法体,具体执行的方法是在使用委托时动态指定的;委托编译时,生成一个新类,继承自Systems.Delegate类;委托的使用创建委托实例;使用new传入调用方法,或使用“=”“+=”指定调用方法;使用委托实例,执行调用方法;注意委托只能执行与其参数、返回值都匹配的方法;委托的使用形式1
——直接使用委托调用方法声明委托对象;
HelloDelegatemyHello;添加委托事件;
myHello=HelloEng;myHello+=HelloChin;注意:第一次的“=”是赋值的语法;第二次的“+=”是绑定的语法。如果第一次就使用“+=”,将出现编译错误。声明委托对象,并指定委托事件
HelloDelegatemyHello=newHelloDelegate(HelloEng);使用委托可以将多个方法绑定到同一个委托变量,当调用此变量时,可以依次调用所有绑定的方法。委托举例11、委托声明publicdelegateintCalc(inti,intj);2、定义被调用的方法classB{publicintAdd(inti,intj)
{Console.WriteLine("{0}+{1}={2}",i,j,i+j);returni+j;
}publicintSub(inti,intj)
{Console.WriteLine("{0}-{1}={2}",i,j,i-j);returni-j;
}}3、委托的使用(1)仅执行一个方法Bbb=newB();Calccal=newCalc(bb.Add);Console.WriteLine(cal(1,2));(2)执行多个方法Bbb=newB();Calccal=newCalc(bb.Add);cal+=bb.Sub;cal(1,2);委托的使用形式2
——使用委托处理函数调用方法声明委托对象;
HelloDelegatemyHello;将委托对象与其调用的方法绑定;使用new绑定方法;或者使用=、+=绑定方法;将委托对象作为处理函数的一个参数,调用;假定处理函数定义:
publicvoidHello(stringname,HelloDelegateMakeHello)调用Hello方法: Hello(“张三”,myHello);myHello=HelloChin;HelloDelegatemyHello =newHelloDelegate(HelloChin)委托举例21、委托声明publicdelegateintCalc(inti,intj);2、定义被调用的方法classB{publicintAdd(inti,intj)
{Console.WriteLine("{0}+{1}={2}",i,j,i+j);returni+j;
}publicintSub(inti,intj)
{Console.WriteLine("{0}-{1}={2}",i,j,i-j);returni-j;
}}4、委托的使用(1)仅执行一个方法Bbb=newB();Calccal=newCalc(bb.Add);Ppp=newP();pp.PD(1,2,cal);(2)执行多个方法Bbb=newB();Calccal=newCalc(bb.Add);cal+=bb.Sub;Ppp=newP();pp.PD(1,2,cal);3、定义委托处理函数classP{publicvoidPD(inti,intj,Calcdcalc)
{dcalc(i,j);
}}P94【例5-9】
委托的用法。事件的引入(1/2)将委托对象和委托的处理函数封装到一个类中;使用委托调用方法时,
代码如下:可使用“=”或“+=”进
行赋值和方法绑定;classHelloManage{publicHelloDelegated1;publicvoidHello(stringname){if(d1!=null){d1(name);
}}}HelloManagegm=
newHelloManage();
gm.d1=HelloEng;
gm.d1+=HelloChin;
gm.Hello(“Jim");事件的引入(2/2)使用event进一步封装HelloManage类中的委托d1在类的内部,不管声明的是
public还是protected,总是
private的;在类的外部,注册“+=”和
注销“-=”的访问限定符与
声明事件时的访问符相同。使用委托调用方法时,
代码如下:classHelloManage{publicevent
HelloDelegated1;publicvoidHello(stringname){if(d1!=null){d1(name);
}}}HelloManagegm=
newHelloManage();
gm.d1=HelloEng;
gm.d1+=HelloChin;×√5.4.2事件事件类似于声明一个进行了封装的委托类型的变量;事件和方法一样具有签名,签名包括名称和参数列表;事件的签名通过委托类型来定义;C#中,事件是响应用户对鼠标、键盘操作或自动执行某个与事件关联的方法的行为。事件的声明方法为事件定义委托类型;使用event关键字声明事件;定义引发事件的方法;事件的使用方法创建事件所在类的实例;注册事件;调用引发事件的方法;访问修饰符event委托名称事件名称;访问修饰符delegatevoid委托名称(参数列表);委托名称一般以EventHandler结束事件名一般为委托名去掉EventHandler剩余的部分热水器例子问题描述:假设某热水器烧水时,当水温超过95度的时候:1、扬声器会开始发出语音,告诉你水的温度;2、液晶屏也会改变水温的显示,来提示水已经快烧开了。事情发生的顺序应该是这样的:警报器和显示器告诉热水器,它对水温比较感兴趣(注册)。热水器知道后保留对警报器和显示器的引用。热水器进行烧水这一动作,当水温超过95度时,通过对警报器和显示器的引用,自动调用警报器和显示器的方法。热水器的类定义publicclassHeater{
privateinttemperature;
publicdelegatevoidBoilHandler(intparam);//声明委托
publiceventBoilHandlerBoilEvent;//声明事件
//烧水方法
publicvoidBoilWater(){
for(inti=0;i<=100;i++){
temperature=i;
if(temperature>95){
if(BoilEvent!=null)//如果有对象注册{
BoilEvent(temperature);//调用所有注册对象的方法
}
}
}
}
}报警器和显示器的类定义//警报器
publicclassAlarm{
publicvoidMakeAlert(intparam){
Console.WriteLine(“Alarm:嘀嘀,水已经{0}度了。",param);
}}//显示器
publicclassDisplay{
publicstaticvoidShowMsg(intparam){//静态方法
Console.WriteLine("Display:当前温度:{0}度。",param);
}
}Main方法中通过注册事件调用方法staticvoidMain(){
Heaterheater=newHeater();
Alarmalarm=newAlarm();
heater.BoilEvent+=alarm.MakeAlert;//注册方法
heater.BoilEvent+=Display.ShowMsg;//注册静态方法
heater.BoilWater();//烧水,会自动调用注册过对象的方法}为事件定义带参数的委托类型为事件定义委托的常用形式为:publicdelegate
***EventHandler(Object
sender,EventArgse)接受两个输入参数:一个Object类型,一个EventArgs类型;Objectsender:触发事件的对象;EventArgse:传入的事件参数信息; EventArgs类型,或其派生类(名称以EventArgs结尾);委托返回值为void;事件的声明publicevent***EventHandler事件名;被事件调用的方法具有两个参数,与事件委托的两个参数类型一致;热水器类中的事件定义privateinttemperature;
publicstringtype="RealFire001";//添加型号作为演示
publicstringarea="ChinaXian";//添加产地作为演示
//声明委托
publicdelegatevoidBoiledEventHandler(Objectsender,BoiledEventArgse);//声明事件
publicevent
BoiledEventHandler
Boiled;
//定义BoiledEventArgs类,传递信息
publicclassBoiledEventArgs:EventArgs{
publicreadonlyinttemperature;
publicBoiledEventArgs(inttemperature){
this.temperature=temperature;
}
}热水器类中的方法定义//烧水方法
publicvoidBoilWater(){
for(inti=0;i<=100;i++){
temperature=i;
if(temperature>95){
//建立BoiledEventArgs对象。
BoiledEventArgse=newBoiledEventArgs(temperature);
if(Boiled!=null){//如果有对象注册
Boiled(this,e);//调用所有注册对象的方法
}
}
}
}报警器和显示器的类定义//警报器
publicclassAlarm{publicvoidMakeAlert(Objectsender,Heater.BoiledEventArgse)
{
Heaterheater=(Heater)sender;
//访问sender中的公共字段Console.WriteLine("Alarm:{0}-{1}:",heater.area,heater.type);Console.WriteLine(“Alarm:嘀嘀,水已经{0}度了。",e.temperature);}}//显示器
publicclassDisplay{publicstaticvoidShowMsg(Objectsender,Heater.BoiledEventArgse)
{//静态方法Heaterheater=(Heater)sender;Console.WriteLine("Display:{0}-{1}:",heater.area,heater.type);Console.WriteLine("Display:当前温度:{0}度。",e.temperature);}}Main方法中通过注册事件调用方法staticvoidMain(){Heaterheater=newHeater();Alarmalarm=newAlarm();heater.Boiled+=alarm.MakeAlert;//注册方法heater.Boiled+=Display.ShowMsg;//注册静态方法
heater.BoilWater();//烧水,会自动调用注册过对象的方法
Console.ReadLine();}猫和老鼠的例子事件描述:老鼠偷东西时,随时提防着猫,如果听到猫叫,老鼠闻声立即逃回洞里。猫和老鼠是两个对象,猫是事件生成者对象,猫叫是一个方法,引发Cry事件;老鼠是事件订阅者对象,它提供事件处理程序Run()方法;通过委托和事件实现了老鼠对猫动静的监听,结果是老鼠听到猫叫就逃跑。进一步考虑假定有两种猫:一种是笨猫(dullCat),它追不上老鼠,所以老鼠即使听到它的叫声也不会逃走;另一种猫(smartCat)能抓老鼠,让老鼠闻风丧胆。老鼠听到猫叫不会马上Run,要先判断是哪种猫,只有遇到的是smartCat时,老鼠才会Run。P95【例5-10】
事件的定义和调用方法。5.5反射反射的作用在程序或装配件中查找有关类型的信息,或者从装配件中读取元数据。反射包含的大多数类都在System.Reflection命名空间中。常用的类:Type类查找有关类型的相关信息。Assembly类在System.Reflection命名空间中定义,它允许程序员访问给定装配件的元数据。获取Type对象的2种常用方式使用C#提供的typeof关键字获取指定类型的Type对象
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2030中国智能电网特种变压器行业市场分析技术发展及投资潜力评估规划报告
- 2025-2030中国智能电动叉车生产行业市场现状供需分析及投资评估规划分析研究报告
- 2025-2030中国智能玻璃行业市场发展分析及投资价值评估研究报告
- GB/T 22330.3-2026无规定动物疫病区标准第3部分:无猪水疱病区
- 社区日巡工作制度
- 小学弹性工作制度
- 社区团员工作制度
- 眼镜公司工作制度
- 客户管理工作制度
- 工程科工作制度
- 中学语文课程标准与教材研究 第2版 课件全套 第1-6章 语文课程-语文课程资源
- 《生物信息学课件》课件
- T-CCTAS 34-2022 带肋钢筋轴向冷挤压连接技术规程
- 村文书考试题及答案甘肃
- 十二星座知识及性格课件
- 2025年浙江工贸职业技术学院单招职业倾向性考试题库及答案1套
- 高职应用语文教程(第二版)教案 上篇 文学鉴赏
- 《特种设备重大事故隐患判定准则图解》
- 乡村振兴 高素质农民培养规范 (DB3205T 1138-2024)
- 管道设备钢结构拆除施工方案
- 腮腺炎防治知识培训讲座
评论
0/150
提交评论