欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    第4章 面向对象程序设计基础.doc

    • 资源ID:60078400       资源大小:917.50KB        全文页数:50页
    • 资源格式: DOC        下载积分:20金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要20金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    第4章 面向对象程序设计基础.doc

    第4章 面向对象程序设计基础4.1 面向对象概述面向对象的程序设计(OOP,Object-Oriented Programming)是一种基于结构分析的、以数据为中心的程序设计方法。它的主要思想是将数据及处理这些数据的操作都封装(Encapsulation)到一个称为类(Class)的数据结构中。使用这个类时,只需要定义一个类的变量即可,这个变量叫做对象(Object)。通过调用对象的数据成员完成对类的使用。4.1.1 类和对象概述见教材66-67页4.1.2 属性、方法、继承、重载见教材66-67页4.2 类和对象格式: 类修饰符 class 类名:基类 类的成员;4.2.1 类的声明类修饰符含义none or internal类只能在当前工程中访问public类可以在任何地方访问abstract or internal abstract类只能在当前工程中访问,不能实例化,只能继承public abstract类可以在任何地方访问,不能实例化,只能继承sealed or internal sealed类只能在当前工程中访问,不能派生,只能实例化public sealed类可以在任何地方访问,不能派生,只能实例化4.2.2 对象的声明1.定义对象格式: 类名 对象名;2.创建类的实例: 对象名=new类名(参数列表);或只用一条命令: 类名 对象名=new类名(参数列表);例: class Class Aclass ClassB void Fun() ClassA a=new ClassA();/创建类ClassA的一个实例a3对象的使用格式:对象名.成员函数名 或 对象名.数据4.2.3 类的成员C#类的成员主要有:成员变量、成员函数。类的每个成员都需要设定访问修饰符,默认类型为private修饰符。C#中一个类的成员可有以下访问修饰符:public(公有成员):允许类的内部或外界直接访问。private(私有成员):外界不能直接访问该成员变量或成员函数。对该成员变量或成员函数的访问只能由该类中其他函数访问,其派生类也不能访问。这即为“数据隐藏”。 一般,成员变量声明为private,而成员函数声明为public,这样可使类中的数据更安全。protected(保护成员):对于外界该成员是隐藏的,但这个类的派生类可以访问。internal(内部成员):只有本编译单元内才能访问。例一:访问修饰符的作用class ClassApublic int a;private int b;protected int c;public void SetA()a=1; /正确,允许访问类自身公有成员b=2; /正确,允许访问类自身私有成员c=3; /正确,允许访问类自身保护成员;class ClassB:ClassA/ClassB是类ClassA的派生类public void SetB()ClassA BaseA=new ClassA(); /创建了ClassA的实例BaseABaseA.a=11;/正确,允许访问基类公有成员BaseA.b=22;/错误,不允许访问基类私有成员BaseA.c=33;/正确,允许访问基类保护成员;class ClassCpublic void SetB()ClassA BaseA=new ClassA();BaseA.a =111;/正确,允许访问类的其他公有成员BaseA.b =221;/错误,不允许访问类的其他私有成员BaseA.c =331;/错误,不允许访问类的其他保护成员C#中一个类的成员又可分为静态成员非静态成员静态成员(声明成员的指令前加static保留字)、非静态成员(声明成员的指令前不加static保留字)区别:1.静态成员属于类所有、非静态成员属于对象所有;静态成员只能由类来访问,非静态成员只能由对象来访问,即当一个实例成员在形式E.M的成员访问中被引用时,对于非静态实例成员M,E必须表示一个实例(对象),对静态实例成员M,E必须表示一个类。2.每个对象都有自己的非静态方法,这些非静态方法是多个副本;对于静态成员,在内存中只有一个副本。(当使用一个数据副本就足够时,使用静态成员来节省空间。)3.非静态方法可以直接访问类中的任意成员;静态方法可以直接访问静态成员或通过类访问静态成员,但是不能直接访问非静态成员,只能通过类的实例(对象)访问非静态成员。4.静态方法不对指定的实例进行操作,不能使用this关键字,它表达的是一类事物共同具有的方法,而不是类的实例所独有。静态方法主要应用于提供整个类实例共有的工具函数。5.静态方法中不能包含virtual, abstract, overide修饰符。例二:静态、非静态成员class myClasspublic int a;static public int b;void Fun1()/定义一个非静态成员函数,可以访问类中任意成员a=10;/正确,直接访问非静态成员b=20;/正确,直接访问静态成员static void Fun2()/定义一个静态成员函数,只能访问静态成员a=10;/错误,不能访问非静态成员b=20;/正确,可以访问静态成员,相当于myClass.b=20class Teststatic void Main()myClass A=new myClass();/定义对象A,将其实例化A.a=10;/正确,访问类myClass的非静态公有成员变量aA.b=10;/错误,不能通过对象访问类中静态公有成员myClass.a=20;/错误,不能通过类访问类中非静态公有成员myClass.b=20;/正确,可以通过类访问myClass的静态公有成员变量b例三:对象的使用using System;class Penpublic string Color;/Color是公有成员,可直接访问private int Price;/*Price是私有成员,只能通过该类中的其他成员函数来访问*/public void SetPrice(int newPrice)Price=newPrice;public int GetPrice()return Price;public void SetColor(string newColor)Color=newColor;public string GetColor()return Color;class Testpublic static void Main()Pen myPen=new Pen() ;/myPen是类Pen的实例化myPen.SetPrice(5);/通过调用SetPrice方法来使用私有成员变量myPen.Color="BLACK"Console.WriteLine("The price is 0",myPen.GetPrice();Console.WriteLine("The Color is 0",myPen.Color);return语句的格式:return <返回值>功能:在执行到return语句时,程序会立即返回调用代码,其返回值通常是函数的处理结果,其类型必须与函数的声明类型一致。例如:static double getVal()double checkVal;/给checkVal赋值if (checkVal<5) return 4.7;return 3.2;4.3 构造函数和析构函数4.3.1 构造函数C#构造函数的约定:参见教材P74构造函数例:class MyClas public MyClass()/构造函数,与类同名且无参数,使之成为默认的构造函数/代码部分public MyClass(int i)/*给类添加非默认的构造函数,提供参数,该参数与类实例化时所带参数对应*/代码部分例1:构造函数的应用using System;class Penpublic string Color;private int Price;public Pen()/类PEN的构造函数Color="BLACK"/给变量赋初值Price=5;public void SetPrice(int newPrice)Price=newPrice;public int GetPrice()return Price;public void SetColor(string newColor)Color=newColor;public string GetColor()return Color;class Testpublic static void Main()Pen myPen=new Pen() ;Console.WriteLine("The price is 0",myPen.GetPrice();Console.WriteLine("The Color is 0",myPen.Color); 例2:构造函数的应用using System;namespace 构造方法静态成员class InstCountpublic InstCount() instanceCount+;static public int instanceCount=0;class AppClassstatic void Main()Console.WriteLine (InstCount.instanceCount);InstCount ic1=new InstCount ();Console.WriteLine(InstCount.instanceCount );InstCount ic2=new InstCount ();Console.WriteLine(InstCount.instanceCount );运行结果:0124.3.2 析构函数析构函数在对象销毁时运行,常用来处理对象用完后的收尾工作。析构函数不能带参数,不能拥有访问修饰符,不能显式地被调用。对象的析构函数在该对象被销毁时自动调用。析构函数不能被继承。析构函数的名称是在类名前加一个符号,例如,类pen的析构函数应该是Pen() 4.4方法与重载4.4.1方法的声明方法修饰符 返回值类型 方法名(方法参数列表) /方法实现部分说明:1 常用修饰符:如果修饰符为static ,则为静态方法,该方法只能访问类中的静态成员。如果没有修饰符static ,则为非静态方法,该方法能访问类中的任意成员。如果修饰符为virtual ,则称该方法为虚方法,其执行方式可被派生类改变,即方法可以重写,若一个基类方法要在派生类中被覆盖,就必须把这个基类方法声明为虚方法。非虚方法的执行方式不变。如果修饰符为extern ,则称该方法为外部方法。方法定义放在其他的地方。如果修饰符为override, 则表示该方法重写了一个基类方法(如果方法被重写,就必须使用该修饰符)2 返回值类型:是方法返回给其调用者结果的数据类型。返回值类型void指明方法不返回任何值。方法至多可返回一个值。3 方法参数列表中的每个参数必须有一个数据类型。如:用(int x,y)代替(int x,int y)将会产生编译错。4 在方法体中,不能对方法参数进行重定义。5 方法不能嵌套,即,不允许在一个方法中定义另一个方法例:方法的应用using System;class Testpublic static int Max(int x,int y)/x,y为形式参数if(x>=y)return x;elsereturn y;public static void WriteMin(int x, int y)int temp=x;if(x>y)temp=y;Console.WriteLine("0和1中的最小值是:2.",x,y,temp); return;public static void Main()Console.WriteLine("6和8中的最大值是:0.",Max(6,8);/6,8 为实值参数,其类型、个数与形参对应。WriteMin(6,8);思考题:如果将Max和WriteMin两个方法改成非静态方法,会对原程序造成何影响?为什么?应怎样解决?4.4.2方法的重载方法重载的格式是在一个类中两次或多次定义同名的方法(包括从类中继承而来的方法),这些方法的名称相同,但每个方法的参数类型或个数不同。例1: using System;class Penpublic string Color;private int Price;public Pen()/类Pen的构造函数 Color="BLACK"/给变量赋初值 Price=5;public Pen(string newColor,int newPrice)/类Pen的构造函数的重载函数Color=newColor;Price=newPrice;public void SetPrice(int newPrice) /类Pen的成员函数SetPricePrice=newPrice;public void SetPrice()/类Pen的成员函数SetPrice的重载函数Price=5;public int GetPrice()return Price;public void SetColor(string newColor)Color=newColor;public string GetColor()return Color;class Testpublic static void Main()Pen myPen=new Pen() ;/调用第一个构造函数Pen hisPen=new Pen("GREEN",8);/构造函数的重载Console.WriteLine("The price is 0",myPen.GetPrice();/得到构造函数Pen()中的price值5Console.WriteLine("The Color is 0",myPen.Color);/直接访问公有成员变量Color,值为“BLACK”即构造函数Pen()中的初值Console.WriteLine("The price is 0",hisPen.GetPrice();/得到构造函数重载Pen("GREEN",8)的price值8Console.WriteLine("The Color is 0",hisPen.GetColor();/得到构造函数重载Pen("GREEN",8)的color值“GREEN ”hisPen.SetPrice();/调用SetPrice()重载函数,得到Price值5Console.WriteLine("The price is 0",hisPen.GetPrice();/输出price值5 例2:重载构造方法using System;namespace 重载构造方法class Fileclass CommaDelimitedFilepublic CommaDelimitedFile(string FileName)Console.WriteLine("Constructed with a file name"); public CommaDelimitedFile(File file)Console.WriteLine("Constructed with a file object");class Class1static void Main(string args)File file=new File();CommaDelimitedFile file2=new CommaDelimitedFile(file);CommaDelimitedFile file3=new CommaDelimitedFile("Some file name"); 运行结果:Constructed with a file objectConstructed with a file name练习题:重载构造方法练习using System;namespace 重载构造方法练习class FunApp2public int x=888,y=777,z=666;public FunApp2()x+;y+;z+;public FunApp2(int a,int b,int c)x=a;y=b;z=c;public class FunAppstatic void Main()FunApp2 obj1=new FunApp2();Console.WriteLine(obj1.x);Console.WriteLine(obj1.y);Console.WriteLine(obj1.z);FunApp2 obj2=new FunApp2(888,777,666);Console.WriteLine(obj2.x);Console.WriteLine(obj2.y);Console.WriteLine(obj2.z);运行结果:8897786678887776664.5运算符重载运算符重载声明的格式:返回类型 operator 重载的运算符(运算符参数列表) 运算符重载的实现部分说明:1 所有重载运算符的方法必须定义为public和static。2 重载单目运算符时,可传递一个参数;重载双目运算符时,可传递两个参数。3 不能重载在C#中没有定义的运算符。如:不能用*来定义指数操作。4 不能改变运算符的语法。如:不能用*来做三目运算5 重载运算符不能改变运算的优先级。6 返回类型可以是任意的C#合法的数据类型,在运算符重载的实现部分通过return语句返回该数据类型。C#中可以重载的运算符有:+ - * / % ! + - true false & | << >> = != < > <= >= 7 C#中不能重载的运算符有:= && | ?: new typeof sizeof is例:(按位取反)运算符重载class Spacepublic int x,y,z;public Space(int xx,int yy,int zz)/构造函数x=xx;y=yy;z=zz;public static Space operator (Space d1)/的重载Space Neg=new Space(0,0,0);Neg.x=(-1)*d1.x;Neg.y=(-1)*d1.y;Neg.z=(-1)*d1.z;return Neg;/Neg的类型为Space型,与方法的返回值类型Space一致class Testpublic static void Main()Space d1=new Space(1,2,3);Space d2=d1;/将d1的结果赋给d2,d2为Space型Console.WriteLine("空间坐标(1,2,3)的关于原点对称坐标是:(0,1,2)。",d2.x,d2.y,d2.z);运行结果:空间坐标(1,2,3)的关于原点对称坐标是:(-1,-2,-3)。4.6 继承与多态4.6.1 类的继承类的继承格式:class 基类类名 ;class 派生类类名:基类类名 ;6例:继承的应用:using System;class Pen public string Color;public Pen()Color="BLACK"public void SetColor(string newColor)Color=newColor;public string GetColor()return Color;public void Write()Console.WriteLine("现在用笔进行书写。"); class Pencil:Pennew public void Write()/new关闭覆盖警告,该Write()会覆盖基类中的Write() Console.WriteLine("现在用铅笔进行书写。");public void Erase()Console.WriteLine("现在用橡皮对已写的字进行擦除。");4.6.2 类的多态性多态性是指同一操作作用于不同类的实例,这些类进行不同的解释,从而产生不同的执行结果的现象。两种多态性:编译时的多态性:通过函数重载来实现运行时的多态性:通过虚方法方式来实现例:using System;class ClassApublic void NoV()Console.WriteLine("ClassA.No Virtual"); public virtual void V()Console.WriteLine("ClassA.Virtual"); class ClassB:ClassAnew public void NoV()Console.WriteLine("ClassB.No Virtual"); public override void V()Console.WriteLine("ClassB.Virtual"); class Testpublic static void Main()ClassB b=new ClassB();ClassA a=b;a.NoV();b.NoV();a.V();b.V(); 运行结果:ClassA.NovVirtualClassB.NovVirtualClassB.VirtualClassB.Virtual4.7 this关键字仅限于在构造函数、类的方法和类的实例中使用。它有以下含义:(1) 在类的构造函数中出现的this,作为一个值类型,表示对正在构造的对象本身的引用。(2) 在类的方法中出现的this , 作为一个值类型,表示对调用该方法的对象的引用。(3) 在结构的构造函数中出现的this,作为一个变量类型,表示对正在构造的结构的引用。(4) 在结构的方法中出现的this,作为一个变量类型,表示对调用该方法的结构的引用。(5) 在其他地方使用this 保留字都是不合法的。注意:实际上在C#内部,this 被定义为一个常量。因此使用this+, this这样的语句都是不合法的。但是this可以作为返回值来使用。例如:using System;classApublic int x;public void Main()x=5;Console.WriteLine(“The value of x is: 0”,x);Console.WriteLine(“The value of this.x is: 0”,this.x);结果都是54.8 域、属性和事件4.8.1 域域是类的一个成员,它代表与类或对象相关的变量(域即简单成员变量)声明的格式:域修饰符 域类型 域名域修饰符可以是: new, public, protected, internal, private, static, readonly. 1. 只读域(readonly)只读域只能在域的定义中和它所属类的构造函数中进行修改,在其他情况下,域是只读的。Static readonly 修饰符可起到const相同的效果,例如Public classApublic static readonly double PI=3.14159;public static readonly int kByte=1024;/其他成员2. 域的初始化(1) 在C#中,系统将为每个未经初始化的变量提供一个默认值。(2) 对于静态变量、非静态的对象、变量和数组元素,这些变量自动初始化为本身的默认值。而对于所有引用类型的变量,默认值为null。对于值类型变量,其初始化默认值均为0(布尔值为fasle)(3) 域的默认初始化将分为两种情况:对于静态域,在装载时对其进行初始化;而对于非静态域,在类的实例创建时进行初始化。在初始化之前,域的值是不可预测的。例如:class Teststatic int a=b+1; /a为静态域,此时被初始化,b的默认值为0,a值为1static int b=a+1;/ b为静态域,此时被初始化,a的值为1,b值为2static void Main()Console.WrtieLine(“a=0,b=1”,a,b);结果为a=1,b=2例如:class Aint y=x+1;/错误,x,y为非静态域,它们的值在类的实例创建时进行初始化。int x=1;4.8.2 属性属性是对现实世界中实体特征的抽象,它提供了一种对类或对象的特性的访问机制。属性与域的差别在于它有良好的封装性。属性不允许直接操作类的数据内容,而是通过访问器进行访问。1. 属性的声明:属性修饰符 属性的类型 属性名称 访问声明属性修饰符有: new, public, protected, internal, private, static, virtual, override和 abstract.(含义参见教材P91)2. 属性的访问访问方法(1) 在属性的访问声明中,对属性的读操作使用get访问器,对属性的写操作使用set访问器。例如:private string s_filename;/声明了一个私有的字符串型的域s_filenamepublic string Filename/声明了一个公有的字符串型的属性Filenameget /使用get访问器,为属性指定读数据的方法return s_filename; /get访问器需要用return语句作为结束set /使用set访问器,为属性指定写数据的方法if (s_filename!=value) /保留字value表示set存取程序的参数 s_filename=value;(2) get访问器需要用return语句(或throw语句)作为结束,set访问器有一个隐含的参数value(保留字),表示set存取程序的参数,即可以用value作为用户将要写入的数据。set访问器必须与void方法(没有返回值的方法)的规则相一致。(3) 在定义一个属性之后,就可以像使用变量一样使用它。使用赋值号“=”为属性赋值,在赋值时,set访问器就被调用了。例如:public class Testpublic static void Main()File f=new File();f.Filename=”myfile.txt”;/*写数据,属性Filename作为赋值的对象被引用,此时set访问器被调用。*/stirng s=f.Filename;/从get访问器中取得返回值。3.属性的分类(1) 读写属性:既包括get访问器也包括set访问器的属性。(2) 只读属性:只包括get访问器的属性。不能将只读属性作为赋值的目标。(4) 只写属性:只包括set访问器的属性。只能将只写属性作为赋值的目标。在表达式中引用只写属性是错的。483 引用类型1引用类型不存储实际的数据,而存储指向数据的地址,所以,对于同一个数据可以有多个引用。一般,引用类型的默认值为NULL。2C#中引用类型有四种:类类型、数组类型、接口类型、委托类型3委托(Delegate)类型(1)概念:前面讨论了对象如何将成员变量作为参数传给方法。但有些时候,对象需要将方法作为参数传给其它方法。C#不允许将方法引用作为参数直接传给其它方法,但它提供了封装有一系列方法引用的特殊类,名为委托。委托的作用类似于C+的函数指针。它可以引用静态方法和实例方法。(2)使用:l 要使用委托,首先必须声明。声明格式:修饰符 delegate 返回值类型 委托名(参数列表);在委托的声明中,指定了一个方法头,也叫方法签名,其中包含一个返回类型和参数列表。例:delegate double processDelegate(double param1,double param2);l 在某一类中声明一个方法,该方法必须拥有与上述声明的委托相同的方法头(返回值类型 和参数列表)。例:static double Multiply(double param1,double param2) return param1*param2;l 创建一个委托实例,其中包含对那个方法的一个引用。例:processDelegate process=new processDelegate(Multiply);l 使用委托实例调用方法。例:process(param1,param2)(一个委托声明定义了一个从类System.Delegate延伸的类。一个委托实例封装一个方法及可调用的实体。)例题1:using System;namespace 委托两数乘除class Class1/声明一个委托processDelegate,其签名匹配于两个函数Multiply()、 Divide()delegate double processDelegate(double param1,double param2);static double Multiply(double param1,double param2)/乘法return param1*param2;static double Divide(double param1,double param2)/除法return param1/param2;static void Main() string input,input1,input2; processDelegate process;/声明一个委托类型的变量processConsole.WriteLine("Enter a number:");input1=Console.ReadLine();double param1=Convert.ToDouble(input1); /input1转为double型 Console.WriteLine("Enter another number:"); input2=Console.ReadLine();double param2=Convert.ToDouble(input2);Console.WriteLine("Enter 1 to Multiply or 2 to Divide:");input=Console.ReadLine();if (input="1")process=new processDelegate(Multiply);/*创建委托实例,包含Multiply方法引用*/elseprocess=new processDelegat

    注意事项

    本文(第4章 面向对象程序设计基础.doc)为本站会员(飞****2)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开