C#的面向对象程序设计.ppt_第1页
C#的面向对象程序设计.ppt_第2页
C#的面向对象程序设计.ppt_第3页
C#的面向对象程序设计.ppt_第4页
C#的面向对象程序设计.ppt_第5页
已阅读5页,还剩70页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第6章 C#的面向对象程序设计,内容提要: 类、对象的概念及使用 方法、属性、索引的概念、声明及调用 构造函数和析构函数的定义 继承和接口的用法 委托和事件的声明及调用 目的要求: 理解类、对象、构造函数和析构函数的意义 掌握方法、属性、索引的用法 掌握继承和接口、委托和事件的声明及调用 重点难点: 类、对象、方法、属性、继承、接口、委托和事件,面向对象的程序设计( OOP )的主要思想是将数据及处 理这些数据的操作都封装到一个称为类(Class)的数据结 构中。使用这个类时,只需要定义一个类的变量即可,这 个变量叫做对象(Object)。通过调用对象的数据成员完 成对类的使用。 1. 类 在

2、面向对象理论中,类(class)就是对具有相同特征的一类事物所做的抽象(或者说,归纳)。,6.1 面向对象程序设计的基本概念,2. 对象 类是一种抽象,而对象(object)则是实例(instance), 是具体的。 如果使用如下格式来代表一个类生成一个对象: 类名 对象名; 则: 电子计算机 ComputerA; 电子计算机 ComputerB; 就代表ComputerA和ComputerB是“电子计算机”类的两个不同对象。,3. 类的属性 属性说明了这个类的特点。 例如“PC计算机”类则可能具备如下属性: 计算机的名称 CPU类型 内存容量 硬盘容量 主板型号 显示适配器型号 声卡型号 操

3、作系统类型 通过这些属性,就可以将不同的PC计算机区分开。,3. 类的属性 属性说明了这个类的特点。 例如“PC计算机”类则可能具备如下属性: 计算机的名称 CPU类型 内存容量 硬盘容量 主板型号 显示适配器型号 声卡型号 操作系统类型 通过这些属性,就可以将不同的PC计算机区分开。,4. 类的方法 类的方法(method)代表了一类事物所具备的动作, 是对属性的操作。 比如:“石英钟”类的方法有:秒针前进一格、分 针前进一格、时针前进一格等;而“录像机”类所具备 的方法可以有:播放、定格、录像、倒带、快进等。,5. 派生和继承 在类的继承中,被继承的类称为基类(又称为父类), 由基类继承的

4、类称为派生类(又称为子类)。派生类自动获 得基类的所有属性和方法,而且可以在派生类中添加新的属 性和方法。,6. 多态性 多态性是指在一般类中定义的属性或行为,被特殊 类继承之后,可以具有不同数据类型或表现出不同的行 为。就是程序在运行时,会自动判断对象的派生类型, 并调用相应的方法。 7. 封装 封装就是把对象的属性和服务结合成一个独立的系 统单位,并尽可能隐蔽对象的内部细节。,6.2 类和对象 6.2.1 类的声明 类是C#的一种自定义数据类型,其声明格式为: 类修饰符 class 类名:基类类名 类的成员; ; 说明:C#支持的类修饰符有:new、public、protected、 in

5、ternal、private、abstract、sealed。,例:定义一个车辆类(有三个变量) class Vehicle public int passengers; /乘客数 public int fuelcap; /所耗燃料 public int mpg; /每公里耗油量 ,6.2.2 类的成员 类可以分为两大类:类本身所声明的,以及 从基类中继承而来的。 在C中,按照类的成员是否为函数将其分为两种: 一种不以函数形式体现,称为成员变量; 另一种是以函数形式体现,称为成员函数。,1. 类成员的访问修饰符 (1)public: 允许类的内部或外界直接访问; (2)private: 不允许

6、外界访问,也不允许派生类 访问,即只能在类的内部访问。如 果没有设定访问修饰符,默认为 private; (3)protected: 不允许外界访问,但允许派生类 访问; (4)internal: 只有本类的成员才能访问。 (5)readonly:该成员的值只能读,不能写。也就 是说,除了赋予初始值外,在程序 的任何一个部分将无法更改这个成 员的值。,class ClassA public int a; private int b; protected int c; public void SetA( ) a=1; /正确,允许访问类自身公有成员 b=2; /正确,允许访问类自身私有成员 c=

7、3; /正确,允许访问类自身保护成员 class ClassB:ClassA public void SetB( ) ClassA BaseA=new ClassA( ); BaseA.a=5; /正确,允许访问基类公有成员 BaseA.b=23; /错误,不允许访问基类私有成员 BaseA.c=68; /正确,允许访问基类保护成员 class ClassC public void SetB( ) ClassA BaseA=new ClassA( ); BaseA.a=5; /正确,允许访问类的其他公有成员 BaseA.b=23; /错误,不允许访问类的其他私有成员 BaseA.c=68; /

8、错误,不允许访问类的其他保护成员 ,2. 静态成员与非静态成员 静态成员是在声明成员时在前面加上static保留字; 非静态成员是在声明成员时前面没有static保留字; 静态成员属于类所有,非静态成员属于类的对象所有。 静态成员的访问格式: 类名.静态成员名,若将类中的某个成员声明为static,则该成员称为静态 成员。类中的成员要么是静态的,要么是非静态的。 类的非静态成员属于类的实例所有,每创建一个类的 实例都在内存中为非静态成员开辟了一块区域。而类的静 态成员属于类所有,为这个类的所有实例所共享。无论这 个类创建了多少个对象(实例),一个静态成员在内存中只占有一块区域。,例:静态成员的

9、访问 using System; class Myclass public int nIndex=10; static public double fphi=45.6; class classTest static void Main( ) int a=Myclass.nIndex; /错误,因为nIndex是非静态成员 double b= Myclass.fphi; /正确,因为fphi是静态成员 Console.Write(b); ,6.2.3 对象的声明 创建类的对象。分两步: (1)先声明对象名 格式: 类名 对象名; 例:Vehicle minivan; /定义类Vehicle的一个

10、对象 (2)创建类的实例。 格式:对象名=new 类名( ); 例:minivan=new Vehicle( ); /创建一个实例 以上两步也可以合并成一步。 格式: 类名 对象名=new 类名( ) ; 例: Vehicle minivan =new Vehicle( );,6.3 构造函数和析构函数 C#中有两个特殊的函数:构造函数和析构函数。 构造函数:当类实例化时首先执行的函数; 析构函数:当实例(即对象)从内存中销毁前最后执行 的函数。,6.3.1 构造函数,在C#中,当创建一个对象时,系统首先为这个对象赋予一个标识符,然后给对象分配合适的内存空间,随后系统就自动调用对象的构造函数。

11、 构造函数的类型修饰符总是public,因为构造函数主要是在类外创建对象时自动调用。 格式: class 类名 public 类名( ) /构造函数体 ,例:using System; class MyClass public int x; public Myclass() /类MyClass的构造函数 x=10; class ConsDemo public static void Main() MyClass t1=new MyClass(); MyClass t2=new MyClass(); Console.WriteLine(“0t1”,t1.x, t2.x); ,运行结果如下:,构造

12、函数也可以带参数。,例:using System; class Fruit public string color; public string shape; public Fruit(string c,string s) /类Fruit的构造函数 color=c; shape=s; class Test public static void Main() Fruit Orange=new Fruit(“orange”,”round”);/创建Orange实例 Console.WriteLine(“0,1”,Orange.color, Orange.shape); ,运行结果如下:,构造函数也

13、可以重载。 例:using System; class A public int count; public A() count=-1; public A(int n) count=n; class Test static void Main() A a=new A(); Console.WriteLine(count=0,a.count); A b=new A(5); Console.WriteLine(count=0,b.count); ,运行结果如下:,使用 this关键字 C#中的this关键字是用来代表对象自身。this一般用在构造函数中, 以便区别同名的构造函数参数和类成员变量。

14、例: using System; class Point int x,y; public Point(int x,int y) this.x=x; this.y=y; ,运行结果如下:,class Test static void Main() Point p=new Point(5,6); Console.WriteLine(x=0,p.x); Console.WriteLine(y=0,p.y); ,6.3.2 析构函数,析构函数也是类的特殊的成员函数,它主要用于释放类实例。 析构函数的特殊性表现在以下几个方面: (1)析构函数的名字与类名相同,但它前面需要加一个“”符号; (2)析构函数

15、不能带参数,也没有返回值; (3)当撤消对象时,自动调用析构函数; (4)析构函数不能被继承,也不能被重载。,格式: class 类名 类名( ) /析构函数体 析构函数以与构造函数相反的顺序被调用。,例:using System; class Decon1 public Decon1( ) Console.WriteLine(“调用构造函数Decon1”); Decon1( ) Console.WriteLine(“调用析构函数Decon1”); class Decon2 public Decon2( ) Console.WriteLine(“调用构造函数Decon2”); Decon2(

16、) Console.WriteLine(“调用析构函数Decon2”); class Test public static void Main() Decon1 dec1=new Decon1( ); Decon2 dec2=new Decon2( ); ,运行结果如下:,可以按照程序代码执行的功能或其他依据把相关的语句组织在一起,并给它们注明相应的名称,利用这种方式把程序分块,就形成了类的方法。 方法的功能是通过方法调用实现的。方法调用指定了被调用方法的名字和调用方法所需的信息(参数),调用方法要求被调用方法按照方法参数完成某个任务,并在完成这项任务后由方法返回。如果调用过程出错,则无法完成

17、正常的任务。,6.4 方法,6.4.1 方法的定义及调用,方法是类中用于计算或进行其他操作的成员。类的方法主要用来操作类的数据,提供一种访问数据的途径。 1. 方法的定义 格式: 修饰符 返回值类型 方法名(形式参数列表) 方法体各语句; ,说明:(1)如果省略“方法修饰符”,该方法为类的 私有成员。 (2)“返回类型”指定该方法返回数据的类型, 它可以是任何有效的类型。如果方法不需 要返回一个值,其返回类型必须是void。 (3) “方法参数列表”是用逗号分隔的类型、 标识符对。这里的参数是形式参数,本质 上是一个变量,它用来在调用方法时接收 传给方法的实际参数值,如果方法没有参 数,那么参

18、数列表为空。,2. 从方法返回,一般来说有两种情况将导致方法返回。 第一种情况:当碰到方法的结束花括号。 第二种情况:执行到return语句。 有两种形式的 return:一种用在void方法中(就是那些没有返回值的方法),另一种用在有返回值的方法中。,例:通过方法的结束花括号返回。 using System; class Test public void myMeth( ) int j; for(j=0;j10;j+) if(j%3=0) continue; Console.WriteLine( “0t”,j); static void Main( ) Test lei=new Test(

19、); lei.myMeth( ); ,运行结果如下:,C#允许在一个方法中,有两个或多个return语句,特别是当方法有多个分支时。 例:using System; class Test public void myMeth( ) int j= 8; if(j=5) j=j*2; Console.WriteLine(j ); return; else j=j*3; Console.WriteLine(j ); return; static void Main( ) Test lei=new Test( ); lei.myMeth( ); ,运行结果如下:,注意:一个void方法在下述情况之一下

20、将返回 程序执行时碰到方法的结束花括号;或者程序执行 到一条return语句时。 使用下述形式的return语句来从方法返回一个值给调用者。 格式: return value; 说明:这里value是要从方法中返回的值。,例:用return语句返回值。 public int myMeth( ) int j= 8; if(j=5) return j*2; else return j*3; ,6.4.2 方法的参数类型 调用方法时,可以给方法传递一个或多个值。 传给方法的值叫做实参(argument),在方法内部, 接收实参值的变量叫做形参(parameter),形参在紧 跟着方法名的括号中声明。

21、形参的声明语法与变量 的声明语法一样。形参只在方法内部有效,除了将 接收实参的值外,它与一般的变量没什么区别。 C#方法的参数类型主要有:值参数、引用参数 和输出参数。,1值参数 未用任何修饰符声明的参数为值参数。值 参数在调用该参数所属的方法成员时创建,并 用调用中给定的实参值初始化。当从该方法返 回时值参数被销毁。对值参数的修改不会影响 到原自变量。值参数通过复制原自变量的值来 初始化。,例:使用值参数。 using System; class Test public void Swap(int x,int y) int k; k=x; x=y; y=k; static void Main

22、() int a=8, b=68; Console.WriteLine(a=0, b=1, a, b); Test sw=new Test(); sw.Swap(a, b); Console.WriteLine(a=0, b=1, a, b); ,程序的运行结果为: a=8, b=68 a=8, b=68,2. 引用型参数 用ref修饰符声明的参数为引用参数。引用参数本身并不创建新的存储空间,而是将实参的存储地址传递给形参。可以认为引用参数中就是调用方法时给出的变量,而不是一个新变量。在方法调用中,引用参数必须被赋初值。在调用时,传送给ref参数的必须是变量,类型必须相同,并且必须使用ref修

23、饰。 格式: 方法修饰符 返回类型 方法名(,ref 参数1, ref 参数 2,) 方法实现部分; 调用方法时,实参前面也必须要加上ref。,例:使用引用参数。 using System; class Test public void Swap(ref int x,ref int y) int k; k=x; x=y; y=k; static void Main() int a=8, b=68; Console.WriteLine(a=0, y=1, a, b); Test sw=new Test(); sw.Swap(ref a, ref b); Console.WriteLine(a=0

24、, y=1, a, b); ,程序的运行结果为: a=8, b=68 a=68, b=8,3. 输出参数 用out修饰符定义的参数称为输出参数。如果希望方法返回 多个值,可使用输出参数。 格式: 方法修饰符 返回类型 方法名(,out 参数1, out 参数 2,) 方法实现部分; 调用方法时,实参前面也要加上out。,例:使用输出参数 using System; class MyClass public string TestOut(out string i) i=使用out关键字; return out参数; class test static void Main() string x;

25、MyClass app=new MyClass(); Console.WriteLine(app.TestOut(out x); Console.WriteLine(x); ,运行结果如下:,例: using System; class TestOut /b就是利用out这个输出参数而返回的值 static int OutValue(int a,out char b) b=(char)a; return 9; static void Main() int t=65,r; char m; r=OutValue(t,out m); Console.WriteLine(r=0,m=1,r,m); ,

26、运行结果如下:,注意: 在把引用型实参的值传递给形参之前,必须先对其赋值。这一点是引用参数与输出参数的不同之处。 在带有引用参数的方法中,有可能导致多个变量名指向同一内存地址,从而导致出错。,6.4.2 方法的重载,类中两个以上的方法(包括隐藏的继承而来的方法)取的名字相同,只要使用的参数类型或参数个数不同,编译器便知道在何种情况下应该调用哪个方法,这就叫做方法的重载。 方法重载必须遵守一个重要的约束:每一个被重载方法的参数类型或个数必须不同。当调用重载方法时,将执行形参与实参相匹配的那个方法。,例:方法重载。 using System; class TestoverLoad public v

27、oid print(int i) Console.WriteLine(输出的整数=0,i); public void print(string s) Console.WriteLine(输出的字符串=0, s); public void print(double d) Console.WriteLine(输出的双精度数=0,d); class test public static void Main( ) TestoverLoad app=new TestoverLoad( ); app.print(6); app.print(理解方法重载了吗?); app.print(3.14); ,运行结

28、果为: 输出的整数=6 输出的字符串=理解方法重载了吗? 输出的双精度数=3.14,6.4.4 静态方法与非静态方法 类的成员类型有静态和非静态两种,因此方法也有静态方法和非静态方法两种。使用static 修饰符的方法称为静态方法,没有使用static 修饰符的方法称为非静态方法。 静态方法和非静态方法的区别是:静态方法属于类所有,非静态方法属于用该类定义的对象所有。,例:使用静态方法和非静态方法。 using System; class TestMethod public int a; static public int b; void Fun1( ) /定义一个非静态方法 a = 10;

29、/正确,直接访问非静态成员 b = 20; /正确,直接访问静态成员 static void Fun2( ) /定义一个静态成员方法 a = 10; /错误,不能访问非静态成员 b = 20; /正确,可以访问静态成员,相当于myClass.b = 20 class Test static void Main( ) myClass A = new myClass( ); A.a = 10; /正确,访问类myClass的非静态公有成员变量 A.b = 10; /错误,不能直接访问类中静态公有成员 MyClass.a = 20; /错误,不能通过类访问类中非静态公有成员 MyClass.b =

30、20; /正确,可以通过类访问类myClass中的 /静态公有成员 ,6.4.6 递归,类的方法成员间允许相互调用,也可以自己调用自己。类的方法如果在方法体内直接或间接地自己调用自己就称为递归方法。 递归是常用的程序设计技术,其基本思想就是“自己调用自己”。 递归方法实际上体现了“依此类推”、“用同样的步骤重复”这样的思想,它可以用简单的程序来解决某些复杂的计算问题。 递归调用在完成阶乘运算、级数运算、幂指数运算等方面特别有效。 在执行递归操作时,C#语言把递归过程中的信息保存在堆栈中。如果无限循环地递归,或者递归次数太多,则产生“堆栈溢出”错误。,例:用递归方法求阶乘。利用的数学公式为n!=

31、n*(n-1)!。当n=0时,n!=1。 代码如下: public long F(long n) if (n=0|n=1) return 1; else return n*F(n-1); ,6.5 属性 属性是对现实世界中实体特征的抽象,它提供了一种对类或对象性质的访问。不直接操作类的数据内容,而是通过访问器进行访问(使用get和set对属性的值进行读写)。 由于属性是表达事物的状态的,属性的存取方式可以是读,也可以是写。读写属性分别用get和set进行表示。,6.5 属性 6.5.1 属性的声明 格式: 属性修饰符 属性的类型 属性名称方法声明 说明:若属性是静态成员,通过“类名.属性成员名

32、”访问;若属性是非静态成员,通过“对象名.属性成员名”访问。 通过访问器,类的属性成员可以返回一个值(get访问器),或者接受外界通过赋值语句提供的值(set访问器)。,get访问器 格式: get 语句 说明:get访问器中的语句主要是用return语句返回某一个变量成员的值。 例:class Circle protected int page=2; public int pa get return page; class Test static void Main( ) Circle MyCircle=new Circle( ); int n=MyCircle.pa*10; /读pa属性

33、int m=MyCircle.page*10; /错误!Page是protected ,set访问器 格式: set 语句 说明:set访问器用于外界写入的值。set访问器就像带有一个参数的方法,这个参数的名字是value(注意:参数value是隐含的,不能再定义),它的值就是调用者要写入属性的值。 例:class Circle protected int page; public int pa get return page; set page=value; class Test static void Main( ) Circle MyCircle=new Circle( ); MyCir

34、cle.pa=10; /对pa属性进行写操作 int n=MyCircle.pa*10; /读pa属性 Console.WriteLine(“n=0”,n); ,运行结果如下:,通过属性来设置变量成员的值,可以在访问器中加入代码,以判断数据的合法性。 例:以下是使用条件运算符进行运算,从而保证类ClassA的nIndex不为负数。 class A private int nIndex; public int Index get return nIndex; set nIndex=value=0?value:0; ,class Test static void Main() A p=new A(

35、); p.Index=-9; Console.WriteLine(p.Index); ,运行结果如下:,属性定义可以包含get和set两个访问器的定义,也可以只包含其中的一个。根据get和set访问器的存在或不存在,属性按下面特征进行分类: .既包括get访问器也包括set访问器的属性被称为读写 属性。 .只包括get访问器的属性被称为只读属性。一个只读 属性被赋值是错误的。 .只包括set访问器的属性被称为只写属性。,属性与变量都可以用来表示事物的状态,但属性可以实现只写或只读并且可以对用户指定的值(value)进行有效性检查,从而保证只有正确的状态才会得到设置,而变量不能。所以,在C#中一

36、般采取以下原则: (1)若在类的内部记录事物的状态信息,则用变量。 (2)变量一般用private修饰,以防止对外使用。 (3)对外公布事物的状态信息,则使用属性。 (4)属性一般与某个或某几个变量有对应关系。,索引器是这样一个成员:它能够让对象以类似数组的方式来访问,即可以使对象能用下标来得到一个值,它以访问数组的方法来访问类的数据成员,而实际的读/写操作则是通过get和set来完成的。 6.6.1 索引的定义与使用 格式: 修饰符 类型名 this参数列表 set get 说明:在set方法中,可以使用一个特殊变量value,用以表示用户指定的值,而get方法使用return返回所得到的值

37、。,6.6 索引指示器,例:定义索引指示器,class MyIndexer private string myArray=new string4; public string thisint index get if(index=4) return null; else return myArrayindex; set if(!(index=4) myArrayindex=value; 注意:属性可以是静态成员,而索引指示器只能是实例成员。,6.6.2 使用索引指示器访问对象 使用索引指示器,可以像数组一样访问类的对象,只不过通过数组下标访问的是存储在数组中的数组元素,而索引指示器访问的是类的

38、对象。 使用“常规的”C#数组,下标数字必须是整型值。索引器的一个优点就是程序员可以定义整型和非整型两种下标。,例:using System; class Index string name=new stringA,B,C,D; int i; public int thisstring idx get for(i=0;iname.Length;i+) if(idx=namei) break; if(i=name.Length) return -1; else return i+1; static void Main() Index a=new Index(); if(aA!=-1) Conso

39、le.WriteLine(字符A是序列中的第0个字符,aA); else Console.WriteLine(序列中没有该字符); ,运行结果如下:,委托,顾名思义,就是中间代理人的意思。通俗地说,委托是一个可以引用方法的对象,即是说委托可以调用它所指向的方法。 事件是建立在委托基础上的另一个重要特性。从本质上说,事件就是当某个事情发生时,会自动去执行一些语句。事件是特殊化的委托,委托是事件的基础。,6.7 委托和事件,6.7.1 委托 C#中使用委托的具体的步骤是: (1) 声明一个委托,其参数形式一定要和想要 包含的方法的参数形式一致。 (2) 定义所有你要定义的方法,其参数形式和 第一步

40、中声明的委托对象的参数形式必须 相同。 (3) 创建委托对象并将所希望的方法包含在该 委托对象中。 (4) 通过委托对象调用包含在其中的各个方法。,步骤1: 声明一个委托 格式: 修饰符 delegate 返回类型 委托名(参数列表); 例: 委托的声明 public delegate void MyDelegate1(string input); public delegate double MyDelegate2( ); 声明一个委托的对象,与声明一个普通类对象的方式一样: 委托名 委托对象名; 委托对象的声明。 MyDelegate1 a; MyDelegate2 b;,步骤2:定义方法

41、,其参数形式和步骤1中声明的委托对象的必 须相同。例:定义方法 class MyClass1 public void dMethod1(string input) Console.WriteLine(“Method1传递的参数是 0,input); public void dMethod2(string input) Console.WriteLine( Method1传递的参数是 0,input); ,步骤3:创建一个委托对象并将上面的方法包含其中 例:在委托对象中包含方法。 MyClass1 c2=new MyClass1(); MyDelegate1 d1; d1 = new MyDel

42、egate1(c2.dMethod1); MyDelegate1 d2 = new MyDelegate1(c2.dMethod2); 步骤4:通过委托对象调用包含在其中的方法。 例:调用委托对象包含的方法。 d1(abc); d2(123);,下面这个例子就是将上面的4个步骤合在一起: using System; public delegate void MyDelegate1(string input); class MyClass1 public void dMethod1(string input) Console.WriteLine(dMethod1传递的参数是 0,input);

43、public void dMethod2(string input) Console.WriteLine( dMethod2传递的参数是 0,input); class Driver static void Main() MyClass1 c2=new MyClass1();? MyDelegate1 d1 = new MyDelegate1(c2.dMethod1);? MyDelegate1 d2 = new MyDelegate1(c2.dMethod2);? d1(abc); d2(123); ,运行结果如下:,委托是可以合并的,又称为多播(Multicast)。合并的委托实际上是对多个方法的调用,对这样的委托的调用,实际上是对所包装的各个方法的全部调用,其中的多个方法又称为该委托的调用列表。 对于多个相同类型的委托,可以用加号运算符“+”进行调用列表的合并,可以用减号运算符“-”移除其调用列表中的方法。 委托加减运算后的结果,如果其中不包含方法,则结果为null。 例: strMod a=new strMod(DelegTest.reSpace); strMod b=new strMod(DelegTest.delSpace); strMod c=a+b; c(“How are you!”); /先调用reSpace

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论