已阅读5页,还剩14页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
虚方法:1. 一个虚方法必须要用virtual 或 abstract或override 修饰2. 虚方法不能省略访问控制符,不能是private 和static的,因为他们应该可以被子类所覆盖,3. 子类要覆盖父类中的方法,须用override,否则认为是一个新方法,并隐藏了父类的方法,不会实行虚方法的调用,4. 覆盖与被覆盖的方法必须有相同的可访问性和相同的返回类型虚方法和非虚方法的区别For example:Class A class B:A public void F() new public void F()public virtual void G() public override void G() Class Test public static void Main() B b = new B(); |a.F();/调用A.F|a.G();/调用B.GA a = b; |b.F();/调用B.F|b.G();/调用B.G注释: 虚方法调用的方法是运行时对象实例的方法,如:a.G打印的是B.G的方法而非A.G的方法 非虚方法调用的是便宜时对象类型(A a = b; 既认为是a,而非b),如a.F执行的是A.F方法虚方法调用和非虚方法调用的混合使用:由于可以在子类中用override来覆盖父类的方法,又可以使用new修饰符来隐藏继承的方法,所以在多次继承的情况下,会产生比较复杂的现象,这时,调用哪个方法不由运行时和编译时类型对象来决定:Class AClass B : Aclass C : B Public virtual void F() public override void F() new public virtual void F()Class D : C Public override void F() Class Test D d = new D(); | B b = d;| a.F();/调用B.F|c.F();/调用D.F A a = d;| C c = d;| b.F();/调用B.F|d.F();/调用D.F反射:运行时根据程序集及其中的类型得到相关的信息称为反射(Reflection),动态类型创建指运行时动态创建对象.常用的类有: System.TypeSystem.Assembly System.Activator;常用的命名空间: System.RunTmeSystem.Reflection反射就是利用Assembly的matedata(元数据)来操作Assembly及其所含内容的一种操作,其本质就是具有可以在一个程序运行的时候去动态分析、生成和操纵对象、类、属性、方法等等的我们的程序的元素This关键字:关键字this仅限于在构造函数中、类的方法和类的实例中使用 在类的构造函数中出现的this做为一个引用类型,它表示对正在构造对象本身的引用 在类的方法中出现的this作为一个引用类型,它表示对调用该方法的对象的引用 在结构的构造函数中出现的this作为一个值类型,它表示对正在构造的结构的引用 在结构的方法中出现的this作为一个变量类型,它表示对调用该方法的结构的引用 在任何其他地方使用this关键字都是不合法的代理(delegate):代理是通过一个指向函数的指针变量(存放函数指针)来灵活调用多个不同功能的方法,它是面向对象和类型安全的同一个代理可以调用多个不同的方法,所以使用代理可以在程序运行期调用某个所需的方法(实例方法和静态方法)但使用代理最重要的特征是:代理只是检查要调用的方法是否与代理的标识想匹配,因为代理只能调用和其定义特征相符的方法,所以代理可以执行匿名方法调用抽象类与非抽象类的构造函数:非抽象类的构造函数: public method() : base ()抽象类的构造函数 : protected method(): base() 静态构造函熟:静态构造方法是对整个类进行初始化工作的规定,一个类至多可以有一个静态构造函数:Static ClassName() 它是自动调用的,不能被显式调用 静态构造方法总是在该类的所有静态域初始化后而执行 它总是在该类被使用(如访问静态域,生成实例)之前完成 最多被执行一次 (但是其执行的具体时间和顺序不确定) 接口: 一个类可以继承一个基类,并同时实现一个或多个接口,这时需将各个接口用逗号隔开,并且基类名必须放在被逗号分隔个接口列表名的首位.如:public class SubClass : BaseClass,Interface1,Interface2,. 一个类有可能要同时实现多个接口,如果每个接口都定义了同名、同类型的成员,则在类总采用完全限定名来显式实现各接口中的相应成员,就可以消除歧义 在使用完全限定名来实现一个接口成员时,在类中该借口成员的实现方法是私有的:Public interface ISharp|public interface ISameble| Void play();| void play();|实现接口方法play: public class test : Isharp, ISamebleVoid ISharp.play()Void ISameble.play()注 这两个显式实现的私有成员,不能用public修饰接口和抽象类的异同:相同点: 都包含有可以有派生类继承的成员,他们都不能直接实例化,但可以申明它们的变量不同点: 派生类只能有一个基类,即只能继承一个抽象类(但可以用一个继承链包含多个抽象类).相反,类可以使用任意多个接口抽象类可以拥有抽象成员(没有代码体,且必须在派生类中实现,否则,派生类也是抽象类),也可以拥有非抽象成员(他们拥有代码体,也可以是虚拟的,这样就可以在派生类里重写).另一方面,接口成员必须都在使用接口的类上执行,因为它们没有代码体接口成员被定义为公共的(因为他们倾向于在外部使用),但抽象类的成员却可以使私有的(只要它们不是抽象的)、受保护的、内部的或受保护内部成员(其中受保护的内部成员只能在应用程序集的代码或派生类中访问).另外,接口不包含字段,构造函数、析构函数、静态成员和常量.但可以包含:方法、索引器、属性、事件、代理等的定义,但不包含实现.访问修饰符:Public 修饰的成员可以由任意代码访问Private 修饰的成员只能由类中的代码访问(如果没有使用任何关键字,就默认此)Protected 成员只能由类和派生类中的代码访问Internal 修饰的成员只能有定义它的工程(程序集)内部的代码访问Protected internal 它们只能有工程(程序集)中派生类的代码访问字段、方法、属性还都可以使用关键字static来声明.表明是属于类的静态成员,不是对象实例的成员方法修饰符:Virtual 方法可以重写Abstract 方法必须重写(只限于抽象类中)Override 方法重写了一个基类的方法(如果方法被重写,就必须使用此关键字)External 访问外部资源(如: 系统Win32 或 API )Override sealed 指定在派生类中不能对此方法进一步的修改Checked 和 uncheckedFor Example:Int i = int.MaxInt;/表示带符号int变量能够存储的最大值2147483647Checkedunchecked i+;/执行本块代码时,将抛出异常 i+; /执行本块代码时将不检查是否 “溢出”,-2147483648接口的定义:1. 不允许使用访问修饰符(public ,protected,private ,internal 等等),所有成员都是公共的2. 接口成员不能包含代码体3. 接口不能定义域成员(属性)4. 接口成员不能使用关键字static,virtual,abstract或sealed来定义, 可以使用关键字virtual或abstract来执行接口成员,但不能使用static或const5. 类型定义成员是禁止的. 但要隐藏继承了基接口的成员,可以用关键字new来定义他们ADO 与ADO.NET: ADO与ADO.NET既有相似也有区别,他们都能够编写对数据库服务器中的数据进行访问和操作的应用程序,并且易于使用、高速度、低内存支出和占用磁盘空间较少,支持用于建立基于客户端/服务器和 Web 的应用程序的主要功能。但是ADO使用OLE DB接口并基于微软的COM技术,而ADO.NET拥有自己的ADO.NET接口并且基于微软的.NET体系架构。众所周知.NET体系不同于COM体系,ADO.NET接口也就完全不同于ADO和OLE DB接口,这也就是说ADO.NET和ADO是两种数据访问方式ADO以Recordset存储,而ADO.NET则以DataSet表示。Recordset看起来更像单表,如果让Recordset以多表的方式表示就必须在SQL中进行多表连接。反之,DataSet可以是多个表的集合。ADO 的运作是一种在线方式,这意味着不论是浏览或更新数据都必须是实时的。ADO.NET则使用离线方式,在访问数据的时候ADO.NET会利用XML制作数据的一份幅本,ADO.NET的数据库连接也只有在这段时间需要在线。 由于ADO使用COM技术,这就要求所使用的数据类型必须符合COM规范,而ADO.NET基于XML格式,数据类型更为丰富并且不需要再做COM编排导致的数据类型转换,从而提高了整体性能托管代码(manage code) 与 非托管代码(unmange coee) :托管代码可以被定义为在公共语言运行环境(CLR)控制下运行的代码,托管代码可以使用CLR库下的所有功能,比如:自动内存管理、类型检测和异常处理在运行时间外运行的代码称作非托管代码(unmange code),这些代码包括:COM组件、ActiveX接口、Win32API函数,这些代码被直接便宜成本地代码,它们不能享受CLR提供的任何好处,而且他们没有意识到CLR的存在编译非托管代码的能力允许扩展Microsoft.NET框架的边界,.NET 编译器不能编译非托管代码,既然非托管代码没有被编译成Microsoft中间语言(MSIL),它就不会在CLR下运行,其限制如下:1. 内存管理、类型检测、异常处理和碎片收集工作都有这个组件完成,2. 代码不能与其他语言通信3. 需要把它包装成组件才能和托管.NET配件通信.NET基类库有专门的类支持与非托管COM组件的操作,这些类可以在命名空间System.RunTime.InteropService中找到,.NET中的这种协同性服务可以分为以下一种情况:1. 调用单COM DLL 函数的托管代码2. 调用COM对象或ActiveX控件的托管代码3. 调用托管.NET代码的非托管COM DLL堆栈:Class Entity public class stack Entity top;Public Entity next; public void push(Object data)Public Object data; top = new Entity(top,data);Public Entity(Entity next,Object data) public Object Pop()This.next = next; This.data = data; if(pop = null) throw new InvalidOperationException(); Object result = top.data; top = top.next; return result; 1.填空: (1)面向对象的语言具有 继承性、封装性、多态性。(2)能用foreach遍历访问的对象需要实现 IEnumerable接口或声明GetEnumerable 方法的类型。(3)列举ADO.net中的五个主要对象Command、Connection、DataSet、DataSetCommand、DataReader。2. 不定项选择:(1) 以下叙述正确的是: (BC)A. 接口中可以有虚方法。 B. 一个类可以实现多个接口。 C. 接口不能被实例化。 D. 接口中可以包含已实现的方法。 (2) 从数据库读取记录,你可能用到的方法有:(BCD)A. ExecuteNonQueryB. ExecuteScalarC. FillD. ExecuteReader3. 简述 private、 protected、 public、 internal 修饰符的访问权限。private : 私有成员, 在类的内部才可以访问。 protected : 保护成员,该类内部和继承类中可以访问。 public : 公共成员,完全公开,没有访问限制。 Internal: 在同一命名空间内可以访问。protected internal: 在同一个程序集中的代码或同一程序集中派生类的代码 4. 写出一条Sql语句: 取出表A中第31到第40记录(SQLServer, 以自动增长的ID作为主键,注意:ID可能不是连续的。) 解1:select top 10 * from A where id not in (select top 30 id from A) 解2:select top 10 * from A where id (select max(id) from (select top 30 id from A )as A) 5 .列举ASP.NET 页面之间传递值的几种方式。 1.使用QueryString,如.?id=1; response. Redirect(). 2.使用Session变量 3.使用Server.Transfer 6. 写出程序的输出结果 class Class1 private string str = Class1.str; private int i = 0; static void StringConvert(string str) str = string being converted.; static void StringConvert(Class1 c) c.str = string being converted.; static void Add(int i) i+; static void AddWithRef(ref int i) i+; static void Main() int i1 = 10; int i2 = 20; string str = str; Class1 c = new Class1(); Add(i1); AddWithRef(ref i2); Add(c.i); StringConvert(str); StringConvert(c); Console.WriteLine(i1); Console.WriteLine(i2); Console.WriteLine(c.i); Console.WriteLine(str); Console.WriteLine(c.str); 输出结果:(考查值引用和对象引用) 10 21 0 str string being converted.7.写出程序的输出结果 public abstract class A public A() Console.WriteLine(A); public virtual void Fun() Console.WriteLine(A.Fun(); public class B: A public B() Console.WriteLine(B); public new void Fun() Console.WriteLine(B.Fun(); public static void Main() A a = new B(); a.Fun(); 输出结果: A B A.Fun()8.写出程序的输出结果: public class A public virtual void Fun1(int i) Console.WriteLine(i); public void Fun2(A a) a.Fun1(1); Fun1(5); public class B : A public override void Fun1(int i) base.Fun1 (i + 1); public static void Main() B b = new B(); A a = new A(); a.Fun2(b); b.Fun2(a); 输出结果: 2 5 1 69. 一列数的规则如下: 1、1、2、3、5、8、13、21、34. 求第30位数是多少, 用递归算法实现。(C#语言)public class MainClass public static void Main() Console.WriteLine(Foo(30); public static int Foo(int i) if (i 0 & i = 2) return 1; else return Foo(i -1) + Foo(i - 2); 10.程序设计: 猫大叫一声,所有的老鼠都开始逃跑,主人被惊醒。(C#语言) 要求:1.要有联动性,老鼠和主人的行为是被动的。2.考虑可扩展性,猫的叫声可能引起其他联动效应。要点 1. 联动效果,运行代码只要执行Cat.Cryed()方法。2. 对老鼠和主人进行抽象 分析: 构造出Cat、Mouse、Master三个类,并能使程序运行 从Mouse和Master中提取抽象 联动效应,只要执行Cat.Cryed()就可以使老鼠逃跑,主人惊醒解法一:public interface Observer void Response(); /观察者的响应,如是老鼠见到猫的反映 public interface Subject void AimAt(Observer obs); /针对哪些观察者,这里指猫的要扑捉的对象-老鼠 public class Mouse : Observer private string name; public Mouse(string name, Subject subj) = name; subj.AimAt(this); public void Response() Console.WriteLine(name + attempt to escape!); public class Master : Observer public Master(Subject subj) subj.AimAt(this); public void Response() Console.WriteLine(Host waken!); public class Cat : Subject private ArrayList observers; public Cat() this.observers = new ArrayList(); public void AimAt(Observer obs) this.observers.Add(obs); public void Cry() Console.WriteLine(Cat cryed!); foreach (Observer obs in this.observers) obs.Response(); class MainClass static void Main(string args) Cat cat = new Cat(); Mouse mouse1 = new Mouse(mouse1, cat); Mouse mouse2 = new Mouse(mouse2, cat); Master master = new Master(cat); cat.Cry(); /-解法二: /设计方法二: 使用event - delegate设计public delegate void SubEventHandler(); public abstract class Subject public event SubEventHandler SubEvent; protected void FireAway() if (this.SubEvent != null) this.SubEvent(); public class Cat : Subject public void Cry() Console.WriteLine(cat cryed.); this.FireAway(); public abstract class Observer public Observer(Subject sub) sub.SubEvent += new SubEventHandler(Response); public abstract void Response(); public class Mouse : Observer private string name; public Mouse(string name, Subject sub) : base(sub) = name; public override void Response() Console.WriteLine(name + attempt to escape!); public class Master : Observer public Master(Subject sub) : base(sub) public override void Response() Console.WriteLine(host waken); class Class1 static void Main(string args) Cat cat = new Cat(); Mouse mouse1 = new Mouse(mouse1, cat); Mouse mouse2 = new Mouse(mouse2, cat); Master master = new Master(cat); cat.Cry(); 对于这样的一个枚举类型:enum Color:byteRed,Green,Blue,Orange试写一段程序显示出枚举类型中定义的所有符号名称以及它们对应的数值string ss=Enum.GetNames(typeof(Color);byte bb=Enum.GetValues(typeof(Color);、进程和线程的区别进程是系统进行资源分配和调度的单位;线程是CPU调度和分派的单位,一个进程可以有多个线程,这些线程共享这个进程的资源。、成员变量和成员函数前加static的作用它们被称为常成员变量和常成员函数,又称为类成员变量和类成员函数。分别用来反映类的状态。比如类成员变量可以用来统计类实例的数量,类成员函数负责这种统计的动作。、malloc和new的区别new是C+的关键字。malloc在分配内存时必须按给出的字节分配,new可以按照对象的大小自动分配,并且能调用构造函数。可以说new是对象的对象,而malloc不是。本质上new分配内存时,还会在实际内存块的前后加上附加信息,所以new所使用的内存大小比malloc多。、堆和栈的区别栈:由编译器自动分配、释放。在函数体中定义的变量通常在栈上。堆:一般由程序员分配释放。用new、malloc等分配内存函数分配得到的就是在堆上。栈是机器系统提供的数据结构,而堆则是C/C+函数库提供的。栈是系统提供的功能,特点是快速高效,缺点是有限制,数据不灵活;而栈是函数库提供的功能,特点是灵活方便,数据适应面广泛,但是效率有一定降低。栈是系统数据结构,对于进程/线程是唯一的;堆是函数库内部数据结构,不一定唯一。不同堆分配的内存无法互相操作。栈空间分静态分配和动态分配两种。静态分配是编译器完成的,比如自动变量(auto)的分配。动态分配由alloca函数完成。栈的动态分配无需释放(是自动的),也就没有释放函数。为可移植的程序起见,栈的动态分配操作是不被鼓励的!堆空间的分配总是动态的,虽然程序结束时所有的数据空间都会被释放回系统,但是精确的申请内存/释放内存匹配是良好程序的基本要素。C#(C-Sharp) 与 java一、C#、C+和Java C#的语言规范由Microsoft的Anders Hejlsberg与Scott Wiltamuth编写。在当前Microsoft天花乱坠的宣传中,对C#和C+、Java作一番比较总是很有趣的。考虑到当前IT媒体的舆论倾向,如果你早就知道C#更接近Java而不是C+,事情也不值得大惊小怪。对于刚刚加入这场讨论的读者,下面的表1让你自己作出判断。显然,结论应该是:Java和C#虽然不是孪生子,但C#最主要的特色却更接近Java而不是C+。表1:比较C#、C+和Java最重要的功能功能C#C+Java继承允许继承单个类,允许实现多个接口允许从多个类继承允许继承单个类,允许实现多个接口接口实现通过“interface”关键词通过抽象类通过“interface”关键词内存管理由运行时环境管理,使用垃圾收集器需要手工管理由运行时环境管理,使用垃圾收集器指针支持,但只在很少使用的非安全模式下才支持。通常以引用取代指针支持,一种很常用的功能。完全不支持。代之以引用。源代码编译后的形式.NET中间语言(IL)可执行代码字节码单一的公共基类是否是异常处理异常处理返回错误异常处理。了解表1总结的重要语言功能之后,请继续往下阅读,了解C#和Java的一些重要区别。二、语言规范的比较 2.1、简单数据类型 简单数据类型(Primitive)在C#中称为值类型,C#预定义的简单数据类型比Java多。例如,C#有unit,即无符号整数。表2列出了所有C#的预定义数据类型:表2:C#中的值类型类型说明object所有类型的最终极的基类string字符串类型;字符串是一个Unicode字符的序列sbyte8位带符号整数short16位带符号整数int32位带符号整数long64位带符号整数byte8位无符号整数ushort16位无符号整数uint32位无符号整数ulong64位无符号整数float单精度浮点数类型double双精度浮点数类型bool布尔类型;bool值或者是true,或者是falsechar字符类型;一个char值即是一个Unicode字符decimal有28位有效数字的高精度小数类型2.2、常量 忘掉Java中的static final修饰符。在C#中,常量可以用const关键词声明。public const int x = 55;此外,C#的设计者还增加了readonly关键词。如果编译器编译时未能确定常量值,你可以使用readonly关键词。readonly域只能通过初始化器或类的构造函数设置。2.3、公用类的入口点 在Java中,公用类的入口点是一个名为main的公用静态方法。main方法的参数是String对象数组,它没有返回值。在C#中,main方法变成了公用静态方法Main(大写的M),Main方法的参数也是一个String对象数组,而且也没有返回值,如下面的原型声明所示:public static void Main(String args)但是,C#的Main方法不局限于此。如果不向Main方法传递任何参数,你可以使用上述Main方法的一个重载版本,即不带参数列表的版本。也就是说,下面的Main方法也是一个合法的入口点:public static void Main()另外,如果你认为有必要的话,Main方法还可以返回一个int。例如,下面代码中的Main方法返回1:using System;public class Hello public static int Main() Console.WriteLine(Done);return 1;与此相对,在Java中重载main方法是不合法的。2.4、switch语句 在Java中,switch语句只能处理整数。但C#中的switch语句不同,它还能够处理字符变量。请考虑下面用switch语句处理字符串变量的C#代码:using System;public class Hello public static void Main(String args) switch (args0) case 老板:Console.WriteLine(早上好!我们随时准备为您效劳!);break;case 雇员:Console.WriteLine(早上好!你可以开始工作了!);break;default:Console.WriteLine(早上好!祝你好运!);break;与Java中的switch不同,C#的switch语句要求每一个case块或者在块的末尾提供一个break语句,或者用goto转到switch内的其他case标签。2.5、foreach语句 foreach语句枚举集合中的各个元素,为集合中的每一个元素执行一次代码块。请参见下面的例子。using System;public class Hello public static void Main(String args) foreach (String arg in args)Console.WriteLine(arg);如果在运行这个执行文件的时候指定了参数,比如“Hello Peter Kevin Richard”,则程序的输出将是下面几行文字:PeterKevinRichard2.6、C#没有移位操作符 C#支持uint和ulong之类的无符号变量类型。因此,在C#中,右移操作符(即“”)对于无符号变量类型和带符号变量类型(比如int和long)的处理方式不同。右移uint和ulong丢弃低位并把空出的高位设置为零;但对于int和long类型的变量,“”操作符丢弃低位,同时,只有当变量值是正数时,“”才把空出的高位设置成零;如果“”操作的是一个负数,空出的高位被设置成为1。Java中不存在无符号的变量类型。因此,我们用“”操作符在右移时引入负号位;否则,使用“”操作符。2.7、goto关键词 Java不用goto关键词。在C#中,goto允许你转到指定的标签。不过,C#以特别谨慎的态度对待goto,比如它不允许goto转入到语句块的内部。在Java中,你可以用带标签的语句加上break或continue取代C#中的goto。2.8、声明数组 在Java中,数组的声明方法非常灵活,实际上有许多种声明方法都属于合法的方法。例如,下面的几行代码是等价的:int x = 0, 1, 2, 3 ;int x = 0, 1, 2, 3 ;但在C#中,只有第一行代码合法,不能放到变量名字之后。2.9、包 在C#中,包(Package)被称为名称空间。把名称空间引入C#程序的关键词是“using”。例如,“using System;”这个语句引入了System名称空间。然而,与Java不同的是,C#允许为名称空间或者名称空间中的类指定别名:using TheConsole = System.Console;public class Hello public static void Main() TheConsole.WriteLine(使用别名);虽然从概念上看,Java的包类似于.NET的名称空间。然而,两者的实现方式不同。在Java中,包的名字同时也是实际存在的实体,它决定了放置.java文件的目录结构。在C#中,物理的包和逻辑的名称之间是完全分离的,也就是说,名称空间的名字不会对物理的打包方式产生任何影响。在C#中,每一个源代码文件可以从属于多个名称空间,而且它可以容纳多个公共类。.NET中包的实体称为程序集(Assembly)。每一个程序集包含一个manifest结构。manifest列举程序集所包含的文件,控制哪些类型和资源被显露到程序集之外,并把对这些类型和资源的引用映射到包含这些类型与资源的文件。程序集是自包含的,一个程序集可以放置到单一的文件之内,也可以分割成多个文件。.NET的这种封装机制解决了DLL文件所面临的问题,即臭名昭著的DLL Hell问题。2.10、默认包 在Java中,java.lang包是默认的包,它无需显式导入就已经自动包含。例如,要把一些文本输出到控制台,你可以使用下面的代码:System.out.println(Hello world from Java);C#中不存在默认的包。如果要向控制台输出文本,你使用System名称空间Console对象的WriteLine方法。但是,你必须显式导入所有的类。代码如下:using System;public class Hello public static void Main() Console.WriteLine(Hello world from C#);2.11、面向对象 Java和C#都是完全面向对象的语言。在面向对象编程的三大原则方面,这两种语言接近得不能再接近。 继承:这两种语言都支持类的单一继承,但类可以实现多个接口。所有类都从一个公共的基类继承。 封装与可见性:无论是在Java还是C#中,你都可以决定类成员是否可见。除了C#的internal访问修饰符之外,两者的可见性机制非常相似。 多态性:Java和C#都支持某些形式的多态性机制,且两者实现方法非常类似。2.12、可访问性 类的每个成员都有特定类型的可访问性。C#中的访问修饰符与Java中的基本对应,但多出了一个internal。简而言之,C#有5种类型的可访问性,如下所示: public:成员可以从任何代码访问。 protected:成员只能从派生类访问。 internal:成员只能从同一程序集的内部访问。 protected internal:成员只能从同一程序集内的派生类访问。 private:成员只能在当前类的内部访问。2.13、派生类 在Java中,我们用关键词“extends”实现继承。C#采用了C+的类派生语法。例如,下面的代码显示了如何派生父类Control从而创建出新类Button:public class Button: Control . . 2.14、最终类 由于C#中不存在final关键词,如果想要某个类不再被派生,你可以使用sealed关键词,如下例所示:sealed class FinalClass . . 2.15、接口 接口这个概念在C#和Java中非常相似。接口的关键词是interface,一个接口可以扩展一个或者多个其他接口。按照惯例,接口的名字以大写字母“I”开头。下面的代码是C#接口的一个例子,它与Java中的接口完全一样:interface IShape void Draw(); 扩展接口的语法与扩展类的语法一样。例如,下例的IRectangularShape接口扩展IShape接口(即,从IShape接口派生出IRectangularShape接口)。interface IRectangularShape: IShape int GetWidth(); 如果你从两个或者两个以上的接口派生,父接口的名字列表用逗号分隔,如下面的代码所示:interface INewInterface: IParent1, IParent2 然而,与Java不同,C#中的接口不能包含域(Field)。另外还要注意,在C#中,接口内的所有方法默认都是公用方法。在Java中,方法声明可以带有public修饰符(即使这并非必要),但在C#中,显式为接口的方法指定public修饰符是非法的。例如,下面的C#接口将产生一个编译错误。interface IShape public void Draw(); 2.16、is和as操作符 C#中的is操作符与Java中的instanceof操作符一样,两者都可以用来测试某个对象的实例是否属于特定的类型。在Java中没有与C#中的as操作符等价的操作符。as操作符与is操作符非常相似,但它更富有“进取心”:如果类型正确的话,as操作符会尝试把被测试的对象引用转换成目标类型;否则,它把变量引用设置成null。为正确理解as操作符,首先请考虑下面这个例子中is操作符的运用。这个例子包含一个I
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026国网上海市电力公司高校毕业生提前批招聘(约450人)笔试备考题库浓缩500题有答案详解
- 2026国网河北省电力公司高校毕业生提前批招聘(约450人)笔试备考题库浓缩500题附答案详解(预热题)
- 2026秋季国家管网集团华南公司(广东省管网公司)高校毕业生招聘考试参考试题(浓缩500题)及答案详解一套
- 2026秋季国家管网集团浙江省天然气管网有限公司高校毕业生招聘笔试模拟试题(浓缩500题)含答案详解(考试直接用)
- 2026秋季国家管网集团工程技术创新公司(国家管网集团造价管理中心)高校毕业生招聘考试参考试题(浓缩500题)附答案详解(突破训练)
- 2026秋季国家管网集团华中公司高校毕业生招聘笔试备考试题(浓缩500题)及答案详解【必刷】
- 2026国网河南省电力公司高校毕业生提前批招聘笔试模拟试题浓缩500题含答案详解(能力提升)
- 2026国网云南省高校毕业生提前批招聘(约450人)笔试模拟试题浓缩500题含答案详解(预热题)
- 2026国家管网集团北方管道公司秋季高校毕业生招聘考试参考题库(浓缩500题)附参考答案详解(a卷)
- 2025国网宁夏电力校园招聘(提前批)笔试模拟试题浓缩500题及答案详解(易错题)
- 医疗AI技术的道德边界与应用
- 解构主义在当代艺术中的应用与发展-全面剖析
- 2024山东省招聘社区工作者题库及答案
- 乡村振兴学习课件
- 放射技术操作规范
- 2025重庆辅警考试题库
- GB/T 45232-2025建筑排水排污用聚丙烯(PP)管道系统
- 直播投流服务合作协议
- 小学生膳食宝塔课件
- 教育基金会学生资助计划
- 离任村干部补贴申请书
评论
0/150
提交评论