vb.net继承抽象类 vba类继承

接口的VB.NET( 一款行业软件)接口

在VB.NET的类里,实现一个接口的语句是:

成都创新互联公司是一家专业提供敖汉企业网站建设,专注与成都网站设计、网站建设、H5响应式网站、小程序制作等业务。10年已为敖汉众多企业、政府机构等服务。创新互联专业的建站公司优惠进行中。

implements接口名称

例如,下面定义一个车(总称)的接口,这里的车是各种车的总称:

Public Interface ICar

Property color() As String

Property speed() As Long

Sub PrintInfo()

End Interface

然后在不同类型的“车”类里实现它:

Public Class A_Car

Implements ICar

Dim m_color As String, m_speed As Long

Public Property color() As String Implements ICar.color

Get

Return m_color

End Get

Set(ByVal Value As String)

m_color = Value

End Set

End Property

Protected Overrides Sub Finalize()

MsgBox(I was deconstructed!)

End Sub

Public Sub New()

m_color = Red

m_speed = 210

MsgBox(I was constructed!)

End Sub

Public Property speed() As Long Implements ICar.speed

Get

Return m_speed

End Get

Set(ByVal Value As Long)

m_speed = speed

End Set

End Property

Public Sub PrintInfo() Implements ICar.PrintInfo

MsgBox(Color: m_color vbNewLine Speed: m_speed, MsgBoxStyle.Information)

End Sub

End Class

在 Form 的 Load 事件中编写:

Dim myCar As New A_Car

myCar.PrintInfo()

运行之后就创建了一个 A_Car 类的实例 myCar,然后出现两个对话框,分别说明实例已经创建和汽车的信息。当窗体卸载时,这个类的实例 myCar 将自动销毁,这时将出现一个“I was deconstructed!”的对话框。

声明一个接口时,需要考虑以下几点:

1.接口主体只限于对方法,索引器以及属性的声明;

2.接口成员是隐式公开的,如果对其显式指定访问级别,就会出现编译器错误;

3.接口中不能包含字段,构造函数和常量等;

4.在接口中不能实现任何方法,属性或者索引器;

5.在指定方法时,只需要给出返回类型,名称和参数列表,然后分号结束。

面向对象的接口

在C++中,一个类被允许继承多个类。但是在Java以后的语言不被允许。

这样,如果想继承多个类时便非常困难。所以开发方想出了新办法:接口。

一个接口内,允许包含变量、常量等一个类所包含的基本内容。但是,接口中的函数不允许设定代码,也就意味着不能把程序入口放到接口里。由上可以理解到,接口是专门被继承的。接口存在的意义也是被继承。和C++里的抽象类里的纯虚函数是相同的。不能被实例化。

定义接口的关键字是interface,例如:

publicinterfaceMyInterface{

public void add(int x,int y);

public void volume(int x,int y,int z);

}

继承接口的关键字是implements,相当于继承类的extends。

需要注意的是,当继承一个接口时,接口里的所有函数必须全部被覆盖。例如:

class Demo implements MyInterface{

public void add(int x,int y){

System.out.println( +(x+y));

}

public void volume(int x,int y,int z){

System.out.println( +(x*y*z));

}

public static void main(String args[]){

Demo d=new Demo();

d.add(10,20);

d.volume(10,10,10);

}

}

输出结果:

30

1000

当想继承多个类时,开发程序不允许,报错。这样就要用到接口。因为接口允许多重继承(,),而类不允许。所以就要用到接口。

16. 在.NET中,一个页面对象是( )类的实例。

1. 简述 private、 protected、 public、 internal 修饰符的访问权限。

答 . private : 私有成员, 在类的内部才可以访问。

protected : 保护成员,该类内部和继承类中可以访问。

public : 公共成员,完全公开,没有访问限制。

internal: 在同一命名空间内可以访问。

2 .列举ASP.NET 页面之间传递值的几种方式。

答. 1.使用QueryString, 如....?id=1; response. Redirect()....

2.使用Session变量

3.使用Server.Transfer

4.C#中的委托是什么?事件是不是一种委托?

答 : 委托可以把一个方法作为参数代入另一个方法。

委托可以理解为指向一个函数的引用。

是,是一种特殊的委托

5.override与重载的区别

答 :override 与重载的区别。重载是方法的名称相同。参数或参数类型不同,进行多

次重载以适应不同的需要

Override 是进行基类中函数的重写。为了适应需要。

6.如果在一个B/S结构的系统中需要传递变量值,但是又不能使用Session、

Cookie、Application,您有几种方法进行处理?

答 : this.Server.Transfer

9.描述一下C#中索引器的实现过程,是否只能根据数字进行索引?

答:不是。可以用任意类型。

11.用.net做B/S结构的系统,您是用几层结构来开发,每一层之间的关系以及为

什么要这样分层?

答:一般为3层

数据访问层,业务层,表示层。

数据访问层对数据库进行增删查改。

业务层一般分为二层,业务表观层实现与表示层的沟通,业务规则层实现用户密

码的安全等。

表示层为了与用户交互例如用户添加表单。

优点: 分工明确,条理清晰,易于调试,而且具有可扩展性。

缺点: 增加成本。

13.什么叫应用程序域?

答:应用程序域可以理解为一种轻量级进程。起到安全的作用。占用资源小。

14.CTS、CLS、CLR分别作何解释?

答:CTS:通用语言系统。CLS:通用语言规范。CLR:公共语言运行库。

15.什么是装箱和拆箱?

答:从值类型接口转换到引用类型装箱。从引用类型转换到值类型拆箱。

16.什么是受管制的代码?

答:unsafe:非托管代码。不经过CLR运行。

17.什么是强类型系统?

答:RTTI:类型识别系统。

18.net中读写数据库需要用到那些类?他们的作用?

答:DataSet:数据存储器。

DataCommand:执行语句命令。

DataAdapter:数据的集合,用语填充。

19.ASP.net的身份验证方式有哪些?分别是什么原理?

答:10。Windwos(默认)用IIS...From(窗体)用帐户....Passport(密钥)

20.什么是Code-Behind技术?

答:代码后植。

21.在.net中,配件的意思是?

答:程序集。(中间语言,源数据,资源,装配清单)

22.常用的调用WebService的方法有哪些?

答:1.使用WSDL.exe命令行工具。

2.使用VS.NET中的Add Web Reference菜单选项

23..net Remoting 的工作原理是什么?

答:服务器端向客户端发送一个进程编号,一个程序域编号,以确定对象的位置

24.在C#中,string str = null 与 string str = “” 请尽量使用文字或图

象说明其中的区别。

答:string str = null 是不给他分配内存空间,而string str = "" 给它分配

长度为空字符串的内存空间。

25.请详述在dotnet中类(class)与结构(struct)的异同?

答:Class可以被实例化,属于引用类型,是分配在内存的堆上的,Struct属于值类

型,是分配在内存的栈上的.

27.分析以下代码,完成填空

string strTmp = "abcdefg某某某";

int i= System.Text.Encoding.Default.GetBytes(strTmp).Length;

int j= strTmp.Length;

以上代码执行完后,i= j=

答:i=13,j=10

28.SQLSERVER服务器中,给定表 table1 中有两个字段 ID、LastUpdateDate,

ID表示更新的事务号, LastUpdateDate表示更新时的服务器时间,请使用一句

SQL语句获得最后更新的事务号

答:Select ID FROM table1 Where LastUpdateDate = (Select MAX

(LastUpdateDate) FROM table1)

30.简要谈一下您对微软.NET 构架下remoting和webservice两项技术的理解以及

实际中的应用。

答:WS主要是可利用HTTP,穿透防火墙。而Remoting可以利用TCP/IP,二进制传

送提高效率。

31.公司要求开发一个继承System.Windows.Forms.ListView类的组件,要求达到

以下的特殊功能:点击ListView各列列头时,能按照点击列的每行值进行重排视

图中的所有行 (排序的方式如DataGrid相似)。根据您的知识,请简要谈一下您的

思路

答:根据点击的列头,包该列的ID取出,按照该ID排序后,在给绑定到ListView中。

33.写出一条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)

34.面向对象的语言具有________性、_________性、________性

答:封装、继承、多态。

35.能用foreach遍历访问的对象需要实现 ________________接口或声明

________________方法的类型。

答:IEnumerable 、 GetEnumerator。

36.GC是什么? 为什么要有GC?

答:GC是垃圾收集器。程序员不用担心内存管理,因为垃圾收集器会自动进行管

理。要请求垃圾收集,可以调用下面的方法之一:

System.gc()

Runtime.getRuntime().gc()

37.String s = new String("xyz");创建了几个String Object?

答:两个对象,一个是“xyx”,一个是指向“xyx”的引用对象s。

39.启动一个线程是用run()还是start()?

答:启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状

态,这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。run()

方法可以产生必须退出的标志来停止一个线程。

40.接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可

继承实体类(concrete class)?

答:接口可以继承接口。抽象类可以实现(implements)接口,抽象类是否可继承

实体类,但前提是实体类必须有明确的构造函数。

41.构造器Constructor是否可被override?

答:构造器Constructor不能被继承,因此不能重写Overriding,但可以被重载

Overloading。

42.是否可以继承String类?

答:String类是final类故不可以继承。

43.try 里的code会

不会被执行,什么时候被执行,在return前还是后?

答:会执行,在return前执行。

44.两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句

话对不对?

答:不对,有相同的hash code。

45.swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?

答:switch(expr1)中,expr1是一个整数表达式。因此传递给 switch 和

case 语句的参数应该是 int、 short、 char 或者 byte。long,string 都不

能作用于swtich。

47.当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此

对象的其它方法?

不能,一个对象的一个synchronized方法只能由一个线程访问。

48.abstract的method是否可同时是static,是否可同时是native,是否可同时是

synchronized?

答:都不能。

49.List, Set, Map是否继承自Collection接口?

答:List,Set是Map不是

50.Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是

equals()? 它们有何区别?

答:Set里的元素是不能重复的,那么用iterator()方法来区分重复与否。

equals()是判读两个Set是否相等。

equals()和==方法决定引用值是否指向同一对象equals()在类中被覆盖,为的是

当两个分离的对象的内容和类型相配的话,返回真值。

51.数组有没有length()这个方法? String有没有length()这个方法?

答:数组没有length()这个方法,有length的属性。String有有length()这个方

法。

52.sleep() 和 wait() 有什么区别?

答:sleep()方法是使线程停止一段时间的方法。在sleep 时间间隔期满后,线程

不一定立即恢复执行。这是因为在那个时刻,其它线程可能正在运行而且没有被

调度为放弃执行,除非(a)“醒来”的线程具有更高的优先级

(b)正在运行的线程因为其它原因而阻塞。

wait()是线程交互时,如果线程对一个同步对象x 发出一个wait()调用,该线程

会暂停执行,被调对象进入等待状态,直到被唤醒或等待时间到。

53.short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错

?

答:short s1 = 1; s1 = s1 + 1;有错,s1是short型,s1+1是int型,不能显式

转化为short型。可修改为s1 =(short)(s1 + 1) 。short s1 = 1; s1 += 1正

确。

54.谈谈final, finally, finalize的区别。

答:

final—修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新

的子类,不能作为父类被继承。因此 一个类不能既被声明为 abstract的,又被

声明为final的。将变量或方法声明为final,可以保证它们在使用中 不被改变。

被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可

修改。被声明为 final的方法也同样只能使用,不能重载

finally—再异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异

常,那么相匹配的 catch 子句就会 执行,然后控制就会进入 finally 块(如果

有的话)。

finalize—方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象

从内存中清除出去之前做必要的清理 工作。这个方法是由垃圾收集器在确定这个

对象没有被引用时对这个对象调用的。它是在 Object 类中定义的 ,因此所有的

类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工

作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。

55.如何处理几十万条并发数据?

答:用存储过程或事务。取得最大标识的时候同时更新..注意主键不是自增量方

式这种方法并发的时候是不会有重复主键的..取得最大标识要有一个存储过程来

获取.

56.Session有什么重大BUG,微软提出了什么方法加以解决?

答:是iis中由于有进程回收机制,系统繁忙的话Session会丢失,可以用Sate

server或SQL Server数据库的方式存储Session不过这种方式比较慢,而且无法

捕获Session的END事件。

57.进程和线程的区别?

答:进程是系统进行资源分配和调度的单位;线程是CPU调度和分派的单位,一个

进程可以有多个线程,这些线程共享这个进程的资源。

58.堆和栈的区别?

答: 栈:由编译器自动分配、释放。在函数体中定义的变量通常在栈上。

堆:一般由程序员分配释放。用new、malloc等分配内存函数分配得到的就是在堆

上。

59.成员变量和成员函数前加static的作用?

答:它们被称为常成员变量和常成员函数,又称为类成员变量和类成员函数。分

别用来反映类的状态。比如类成员变量可以用来统计类实例的数量,类成员函数

负责这种统计的动作。

60.ASP。NET与ASP相比,主要有哪些进步?

答:asp解释形,aspx编译型,性能提高,有利于保护源码。

62.请说明在.net中常用的几种页面间传递参数的方法,并说出他们的优缺点。

答:session(viewstate) 简单,但易丢失

application 全局

cookie 简单,但可能不支持,可能被伪造

input ttype="hidden" 简单,可能被伪造

url参数 简单,显示于地址栏,长度有限

数据库 稳定,安全,但性能相对弱

63.请指出GAC的含义?

答:全局程序集缓存。

64.向服务器发送请求有几种方式?

答:get,post。get一般为链接方式,post一般为按钮方式。

65.DataReader与Dataset有什么区别?

答:一个是只能向前的只读游标,一个是内存中的表。

66.软件开发过程一般有几个阶段?每个阶段的作用?

答:需求分析,架构设计,代码编写,QA,部署

67.在c#中using和new这两个关键字有什么意义,请写出你所知道的意义?using

指令 和语句 new 创建实例 new 隐藏基类中方法。

答:using 引入名称空间或者使用非托管资源

new 新建实例或者隐藏父类方法

68.需要实现对一个字符串的处理,首先将该字符串首尾的空格去掉,如果字符串中

间还有连续空格的话,仅保留一个空格,即允许字符串中间有多个空格,但连续的空

格数不可超过一个.

答:string inputStr=" xx xx ";

inputStr=Regex.Replace(inputStr.Trim()," *"," ");

70.什么叫做SQL注入,如何防止?请举例说明。

答:利用sql关键字对网站进行攻击。过滤关键字'等

71.什么是反射?

答:动态获取程序集信息

72.用Singleton如何写设计模式

答:static属性里面new ,构造函数private

73.什么是Application Pool?

答:Web应用,类似Thread Pool,提高并发性能。

74.什么是虚函数?什么是抽象函数?

答:虚函数:没有实现的,可由子类继承并重写的函数。抽象函数:规定其非虚

子类必须实现的函数,必须被重写。

75.什么是XML?

答:XML即可扩展标记语言。eXtensible Markup Language.标记是指计算机所能

理解的信息符号,通过此种标记,计算机之间可以处理包含各种信息的文章等。

如何定义这些标记,即可以选择国际通用的标记语言,比如HTML,也可以使用象

XML这样由相关人士自由决定的标记语言,这就是语言的可扩展性。XML是从SGML

中简化修改出来的。它主要用到的有XML、XSL和XPath等。

76.什么是Web Service?UDDI?

答:Web Service便是基于网络的、分布式的模块化组件,它执行特定的任务,遵

守具体的技术规范,这些规范使得Web Service能与其他兼容的组件进行互操作。

UDDI 的目的是为电子商务建立标准;UDDI是一套基于Web的、分布式的、为

Web Service提供的、信息注册中心的实现标准规范,同时也包含一组使企业能将

自身提供的Web Service注册,以使别的企业能够发现的访问协议的实现标准。

77.什么是ASP.net中的用户控件?

答:用户控件一般用在内容多为静态,或者少许会改变的情况下..用的比较大..类

似ASP中的include..但是功能要强大的多。

78.列举一下你所了解的XML技术及其应用

答:xml用于配置,用于保存静态数据类型.接触XML最多的是web Services..和

config

79.ADO.net中常用的对象有哪些?分别描述一下。

答:Connection 数据库连接对象

Command 数据库命令

DataReader 数据读取器

DataSet 数据集

80.什么是code-Behind技术。

答:ASPX,RESX和CS三个后缀的文件,这个就是代码分离.实现了HTML代码和服务

器代码分离.方便代码编写和整理.

81.什么是SOAP,有哪些应用。

答:simple object access protocal,简单对象接受协议.以xml为基本编码结构

,建立在已有通信协议上(如http,不过据说ms在搞最底层的架构在tcp/ip上的

soap)的一种规范Web Service使用的协议..

82.C#中 property 与 attribute的区别,他们各有什么用处,这种机制的好处

在哪里?

答:一个是属性,用于存取类的字段,一个是特性,用来标识类,方法等的附加

性质

83.XML 与 HTML 的主要区别

答:1. XML是区分大小写字母的,HTML不区分。

2. 在HTML中,如果上下文清楚地显示出段落或者列表键在何处结尾,那么你可以

省略/p或者/li之类的结束 标记。在XML中,绝对不能省略掉结束标记。

3. 在XML中,拥有单个标记而没有匹配的结束标记的元素必须用一个 / 字符作为

结尾。这样分析器就知道不用 查找结束标记了。

4. 在XML中,属性值必须分装在引号中。在HTML中,引号是可用可不用的。

5. 在HTML中,可以拥有不带值的属性名。在XML中,所有的属性都必须带有相应

的值。

84.c#中的三元运算符是?

答:?:。

85.当整数a赋值给一个object对象时,整数a将会被?

答:装箱。

86.类成员有_____种可访问形式?

答:this.;new Class().Method;

87.public static const int A=1;这段代码有错误么?是什么?

答:const不能用static修饰。

88.float f=-123.567F; int i=(int)f;i的值现在是_____?

答:-123。

89.委托声明的关键字是______?

答:delegate.

90.用sealed修饰的类有什么特点?

答:密封,不能继承。

91.在Asp.net中所有的自定义用户控件都必须继承自________?

答:Control。

92.在.Net中所有可序列化的类都被标记为_____?

答:[serializable]

93.在.Net托管代码中我们不用担心内存漏洞,这是因为有了______?

答:GC。

95.当类T只声明了私有实例构造函数时,则在T的程序文本外部,___可以___(可

以 or 不可以)从T派生出新的类,不可以____(可以 or 不可以)直接创建T的

任何实例。

答:不可以,不可以。

96.下面这段代码有错误么?

switch (i){

case(): 答://case()条件不能为空

CaseZero();

break;

case 1:

CaseOne();

break;

case 2:

dufault; 答://wrong,格式不正确

CaseTwo();

break;

}

97.在.Net中,类System.Web.UI.Page 可以被继承么?

答:可以。

98..net的错误处理机制是什么?

答:.net错误处理机制采用try-catch-finally结构,发生错误时,层层上抛

,直到找到匹配的Catch为止。

99.利用operator声明且仅声明了==,有什么错误么?

答:要同时修改Equale和GetHash() ? 重载了"==" 就必须重载 "!="

101.在.net(C# or vb.net)中如何取消一个窗体的关闭。

答:private void Form1_Closing(object sender,

System.ComponentModel.CancelEventArgs e)

{

e.Cancel=true;

}

102.在.net(C# or vb.net)中,Appplication.Exit 还是 Form.Close有什么

不同?

答:一个是退出整个应用程序,一个是关闭其中一个form。

104.某一密码仅使用K、L、M、N、O共5个字母,密码中的单词从左向右排列,密

码单词必须遵循如下规则:

(1) 密码单词的最小长度是两个字母,可以相同,也可以不同

(2) K不可能是单词的第一个字母

(3) 如果L出现,则出现次数不止一次

(4) M不能使最后一个也不能是倒数第二个字母

(5) K出现,则N就一定出现

(6) O如果是最后一个字母,则L一定出现

问题一:下列哪一个字母可以放在LO中的O后面,形成一个3个字母的密码单词?

A) K B)L C) M D) N

答案:B

问题二:如果能得到的字母是K、L、M,那么能够形成的两个字母长的密码单词的

总数是多少?

A)1个 B)3个 C)6个 D)9个

答案:A

问题三:下列哪一个是单词密码?

A) KLLN B) LOML C) MLLO D)NMKO

答案:C

8. 62-63=1 等式不成立,请移动一个数字(不可以移动减号和等于号),使得等

式成立,如何移动?

答案:62移动成2的6次方

106. C#中 property 与 attribute的区别,他们各有什么用处,这种机制的好

处在哪里?

答:attribute:自定义属性的基类;property :类中的属性

107.C#可否对内存进行直接的操作?

答:在.net下,.net引用了垃圾回收(GC)功能,它替代了程序员 不过在C#中,

不能直接实现Finalize方法,而是在析构函数中调用基类的Finalize()方法

108.ADO。NET相对于ADO等主要有什么改进?

答:1:ado.net不依赖于ole db提供程序,而是使用.net托管提供的程序,2:不使

用com3:不在支持动态游标和服务器端游 4:,可以断开connection而保留当前数

据集可用 5:强类型转换 6:xml支持

109.写一个HTML页面,实现以下功能,左键点击页面时显示“您好”,右键点击

时显示“禁止右键”。并在2分钟后自动关闭页面。

答:script language=javascript

setTimeout('window.close();',3000);

function show()

{

if (window.event.button == 1)

{

alert("左");

}

else if (window.event.button == 2)

{

alert("右");

}

}

/script

110.大概描述一下ASP。NET服务器控件的生命周期

答:初始化 加载视图状态 处理回发数据 加载 发送回发更改通知 处理回发事件

预呈现 保存状态 呈现 处置 卸载

111.Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,

是否可以implements(实现)interface(接口)?

答:不能,可以实现接口

112.Static Nested Class 和 Inner Class的不同,说得越多越好

答:Static Nested Class是被声明为静态(static)的内部类,它可以不依赖

于外部类实例被实例化。而通常的内部类需要在外部类实例化后才能实例化。

113.,和的区别。

是位运算符,表示按位与运算,是逻辑运算符,表示逻辑与(and).

114.HashMap和Hashtable的区别。

答:HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了

Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,

效率上可能高于Hashtable.

116.Overloaded的方法是否可以改变返回值的类型?

答:Overloaded的方法是可以改变返回值的类型。

117.error和exception有什么区别?

答:error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存

溢出。不可能指望程序能处理这样的情况。

exception 表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从

不会发生的情况。

118.%# % 和 % % 有什么区别?

答:%# %表示绑定的数据源

% %是服务器端代码块

119.你觉得ASP.NET 2.0(VS2005)和你以前使用的开发工具(.Net 1.0或其他

)有什么最大的区别?你在以前的平台上使用的哪些开发思想(pattern /

architecture)可以移植到ASP.NET 2.0上 (或者已经内嵌在ASP.NET 2.0中)

答:1 ASP.NET 2.0 把一些代码进行了封装打包,所以相比1.0相同功能减少了很

多代码.

2 同时支持代码分离和页面嵌入服务器端代码两种模式,以前1.0版本,.NET提示帮

助只有在分离的代码文件,无 法 在页面嵌入服务器端代码获得帮助提示,

3 代码和设计界面切换的时候,2.0支持光标定位.这个我比较喜欢

4 在绑定数据,做表的分页.Update,Delete,等操作都可以可视化操作,方便了初

学者

5 在ASP.NET中增加了40多个新的控件,减少了工作量

120.重载与覆盖的区别?

答:1、方法的覆盖是子类和父类之间的关系,是垂直关系;方法的重载是同一个

类中方法之间的关系,是水平关系

2、覆盖只能由一个方法,或只能由一对方法产生关系;方法的重载是多个方法之

间的关系。

3、覆盖要求参数列表相同;重载要求参数列表不同。

4、覆盖关系中,调用那个方法体,是根据对象的类型(对象对应存储空间类型)

来决定;重载关系,是根据调 用时的实参表与形参表来选择方法体的。

121.描述一下C#中索引器的实现过程,是否只能根据数字进行索引?

答:不是。可以用任意类型。

122.在C#中,string str = null 与 string str = " " 请尽量使用文字或图

象说明其中的区别。

答:null是没有空间引用的;

" " 是空间为0的字符串;

126.公司要求开发一个继承System.Windows.Forms.ListView类的组件,要求达

到以下的特殊功能:点击ListView各列列头时,能按照点击列的每行值进行重排

视图中的所有行 (排序的方式如DataGrid相似)。根据您的知识,请简要谈一下您

的思路:

答:根据点击的列头,包该列的ID取出,按照该ID排序后,在给绑定到ListView中

127.什么是WSE?目前最新的版本是多少?

答:WSE (Web Service Extension) 包来提供最新的WEB服务安全保证,目前最

新版本2.0。

130.abstract class和interface有什么区别?

答:声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用

于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现

该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其类型是一

个抽象类,并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方

法。Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽

象类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现

这些方法。

接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。多继承性

可通过实现这样的接口而获得。接口中的所有方法都是抽象的,没有一个有程序

体。接口只可以定义static final成员变量。接口的实现与子类相似,除了该实

现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给

予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用

接口的方法。由于有抽象类,它允许使用接口名作为引用变量的类型。通常的动

态联编将生效。引用可以转换到接口类型或从接口类型转换,instanceof 运算符

可以用来决定某对象的类是否实现了接口。

Microsoft .NET 中的基类继承

继承概述

面向对象编程 (OOP) 语言的一个主要功能就是 继承 继承是指这样一种能力 它可以使用现有类的所有功能 并在无需重新编写原来的类的情况下对这些功能进行扩展 在 Microsoft® Visual Basic® NET 发布之前 Visual Basic 程序员并不具备这种能力 在 Visual Basic NET 中 您可以继承 Microsoft NET 框架中的类 也可以继承您自己创建的类 在本文中 我们将学习如何使用继承 并了解继承是如何大大缩短编程时间的 简单示例

在您创建的许多类中 您会发现您常常需要与先前创建的类中的属性和方法相同的属性和方法 例如 如果有一个名为 Person 类的基类 该类包含 LastName 和 FirstName 属性以及 Print 方法 您会发现对于 Employee 类您也需要这些属性和方法 您可能还需要其他属性 例如 EmployeeID 和 Salary 如果从 Person 类(基类)继承 您可以将这些属性添加到新的 Employee 类中 并且仍然可以访问 Person 类中的所有属性 继承是指某个类可将其自身定义为具有某个特定类的所有属性和方法 然后再通过添加其他属性和方法对基类的定义进行扩展的能力

继承术语

在深入研究这个主题之前 让我们先来定义几个术语 通过继承创建的新类称为 子类 被继承的类称为 基类 父类 或 超类 在某些 OOP 语言中 一个子类可以继承多个基类 也就是说 如果有一个 Person 类和一个 Car 类 则 Driver 类可以继承这两个类的所有属性和方法 而在 NET 中 只允许单一继承 因此每个子类只能有一个基类

NET 支持三类继承 实现继承 接口继承和可视继承 实现继承是指使用基类的属性和方法而无需额外编码的能力 接口继承是指仅使用属性和方法的名称 但是子类必须提供实现的能力 可视继承是指子窗体(类)使用基窗体(类)的外观和实现代码的能力 在 NET 中 一个类可以从某个基类继承而来 而这个基类又可以从另外一个类继承而来 而且 您可以在一个类中使用一个或多个接口

使用继承的原因

继承可以避免重复编写相同的代码 因此十分有用 如果有两个单独的类 而每个类都必须实现 FirstName 和 LastName 属性 则可能会出现重复代码 如果要更改某个属性的实现方式 则需要查找已实现这些属性的所有类以进行更改 这不仅要耗费大量时间 还增加了不同类中出现错误的风险

在考虑使用继承时 有一点需要注意 那就是两个类之间的关系应该是 属于 关系 例如 Employee 是一个人 Manager 也是一个人 因此这两个类都可以继承 Person 类 但是 Leg 类却不能继承 Person 类 因为腿并不是一个人

覆盖

从基类中继承功能时 您可能会发现在基类中编写的一般方法仅执行继承类所需的部分功能 要执行所需的全部功能 您可以在新类中覆盖基类的方法 而无需使用新的名称创建一个全新的方法

进行覆盖时 您可以选择完全覆盖基类的方法 也可以在继承类中编写代码来执行某些操作 然后再调用基类的方法 在覆盖时 请务必仍然使用与原始方法相同的合约(参数和返回类型) 也可以选择先调用基类的方法 然后在执行完基类的方法后编写其他代码

继承基类

继承使您可以在一个类中使用另一个类的全部属性和方法 您可以使用关键字 Inherits 来获得基类的功能 而无需将代码从一个类复制并粘贴到另一个类中

实现继承

本文将创建一个新类 LineDelim 它将继承 Creating Classes in NET(英文)一文中创建的 Line 类的所有功能 之后 本文将通过添加两个其他属性和一个方法对 Line 类进行扩展 要添加的第一个属性是 Delimiter 使用它可以获得一个分隔符字符 并将其设置到类中 此分隔符将用于将行中的所有空格替换为分隔符字符 要添加的第二个属性是 OriginalLine 它将用于在向文本行插入新的分隔符之前保留文本的原始行 要创建的新方法是 ReplaceAll() 它将用于将文本行中的所有空格替换为分隔符字符 然后我们将学习如何覆盖 GetWord 方法 以便使用此分隔符(而不是空格)分隔文本行并搜索第一个词 构建示例窗体

要创建窗体 请单击 Project(项目) 然后单击 Add Windows Form(添加 Windows 窗体) 将窗体命名为 frmLineTest VB 并单击 OK(确定)

然后在该窗体上创建相应的控件并设置属性

构建 Line 类

接下来将构建要继承的 Line 类

从菜单中单击 Project(项目) 然后单击 Add Class(添加类) 键入如下所示的代码

Public Class LinePrivate mstrLine As StringProperty Line() As StringGetReturn mstrLineEnd GetSet(ByVal Value As String)mstrLine = ValueEnd SetEnd PropertyReadOnly Property Length() As IntegerGetReturn mstrLine LengthEnd GetEnd PropertyPublic Function GetWord() As StringDim astrWords() As StringastrWords = mstrLine Split( ToCharArray())Return astrWords( )End FunctionEnd Class

创建子类 既然窗体和基类都已经创建完毕 现在便可以开始执行继承了

单击 Project(项目) 然后单击 Add Class(添加类) 将该类命名为 LineDelim vb 并单击 OK(确定) 添加新类时 请修改 Visual 所创建的代码 使之与下面的示例代码相似

Public Class LineDelimInherits Line

End Class

因为添加了 Inherits Line 语句 所以您可以在这一新创建的类中使用 Line 类的所有属性和方法

试一试打开 frmLineTest vb 窗体 双击 Get Word(取词)按钮 向此按钮的单击事件过程添加以下代码

Protected Sub btnFirst_Click(ByVal sender As Object _

ByVal e As System EventArgs) Handles btnFirst ClickDim oLine As LineDelim = New LineDelim()oLine Line = txtLine TexttxtFirstWord Text = oLine GetWord()End Sub

运行项目 并在窗体上单击 Get Word(取词)按钮 您将看到 The 一字出现在按钮旁边的只读文本框中 Inherits 语句的功能非常强大 只需要使用这一个语句 就可以在 LineDelim 类中使用 Line 类的所有属性和方法 尽管这个新类尚未执行任何新的操作 但它却表明从 Line 类中继承的所有代码都可以正常工作

添加其他功能 现在 您可以使用其他属性和方法对 LineDelim 类进行扩展 要向 LineDelim 类添加两个新的属性 请执行以下步骤

在上一部分添加的 Inherits 语句后添加两个 Private 变量 如下所示

Private mstrDelim As String = Private mstrOriginal As String

键入如下代码 为这两个 Private 变量添加适当的 Property 语句 您可以将以下代码放在上面输入的两行代码后面(紧挨这两行)

Public Property Delimiter() As StringGetReturn mstrDelimEnd GetSet(ByVal Value As String)mstrDelim = ValueEnd SetEnd PropertyPublic ReadOnly Property OriginalLine() As StringGetReturn mstrOriginalEnd GetEnd Property

现在您可以使用 Delimiter 属性设置并获取 Private 变量 mstrDelim 的值

如果不希望其他人更改这些属性 您可以将属性设为只读 要执行此操作 请不再使用 Set 语句 并在 Property 语句中添加 ReadOnly 属性 有关示例 请参见上面代码中显示的 OriginalLine 属性声明

接下来 需要创建一个称为 ReplaceAll 的方法 此方法可以将文本行中的所有空格替换为传递到 Delimiter 属性中的分隔符字符

Public Function ReplaceAll() As StringmstrOriginal = MyBase LineReturn MyBase Line Replace( mstrDelim ToChar())End Function

ReplaceAll 方法通过基类的 Line 方法检索原始文本行 而以前从基类中检索属性时使用的是 MyBase Line 语法 ReplaceAll 函数将 MyBase Line 属性的值放入您刚刚为该类创建的 Private 变量 mstrOriginal 中 String 数据类型的 Replace 方法将字符串字符的所有实例替换为在 Delimiter 属性中设置的新分隔符字符 mstrDelim MyBase 关键字 可以从任一子类使用 MyBase 关键字 以调用基类中的任何属性或方法 即使基类的方法在子类中已被覆盖 您也可以使用该关键字对其进行调用 例如 如果在基类中存在 ReplaceAll 方法 但在子类中该方法已被覆盖 您可以从子类的 ReplaceAll 方法中调用基类的 ReplaceAll 方法

试一试打开 frmLineTest VB 窗体 双击 Replace(替换)以调出单击事件过程 在 btnReplace 按钮的单击事件中编写以下代码

Protected Sub btnReplace_Click( _ ByVal sender As Object _ByVal e As System EventArgs) Handles btnReplace ClickDim oLine As LineDelim = New LineDelim()oLine Delimiter = txtDelim TextoLine Line = txtLine TexttxtReplace Text = oLine ReplaceAll()End Sub

此代码将 Delimiter 属性设置为在示例窗体的 txtDelimiter 文本框中输入的值 然后您可以调用 ReplaceAll 方法 将文本行中的所有空格更改为新的分隔符字符

按 F 键运行该项目 单击 Replace(替换) 您将看到 在此按钮旁边的文本框中 句中的每个词之间都有一个逗号 覆盖方法 添加 Delimiter 属性后 您可能想更改 LineDelim 类中的 GetWord 方法 以便使用相应的分隔符替代 Line 类使用的单个空格 因为您不一定想更改基类 所以需要覆盖 LineDelim 类中 GetWord 方法的功能 在 LineDelim 类中创建新的 GetWord 方法之前 您需要在 Line 类的 GetWord 方法声明中添加一个关键字

在 Solution Explorer(解决方案资源管理器)窗口中 打开 Line vb 类的代码窗口 找到 GetWord 方法的声明(声明不包含参数) 如下所示 Public Overloads Function GetWord() As String在函数声明中添加关键字 Overridable 如下所示(没有此关键字 就无法覆盖此方法) Public Overridable Overloads Function GetWord() As String打开 LineDelim vb 类 并使用如下代码添加新的 GetWord 方法

Public Overloads Overrides Function GetWord() As StringDim astrWords() As StringastrWords = MyBase Line Split(mstrDelim ToCharArray())Return astrWords( )End Function

如果要更改基类中方法的功能 则有必要在函数声明中添加 Overrides 关键字 现在 LineDelim 类中的 GetWord 方法就可以使用 Delimiter 属性的值来分隔句中的词

如果只覆盖其中一个 GetWord 方法 则代码只能查看这一个版本的方法 而无法调用其他版本的 GetWord 方法 要显示所有方法 您必须覆盖每一个方法 就象您在 LineDelim 类中所执行的操作一样

试一试按 F 键运行该项目 在句中的每个词之间都输入一个逗号 并在 Delimiter(分隔符)文本框中输入一个逗号 单击 Get Word(取词) 句中的第一个词将出现在该按钮旁边的文本框中

抽象类 在本文上一部分的示例中 我们学习了如何创建 Person 对象 这是因为我们想处理普通的人 但是您可能会发现 如果不先添加一些特定的行为和/或数据 就无法使用 Person 类执行任何操作 因此您可以将 Person 类变为抽象类 抽象类仅定义将由子类创建的一般属性和方法

将 Person 类定义为只能被继承的抽象类 而不是在运行时实际创建的对象 从该类继承的每个类(如 Employee 类)都将使用特定的功能来创建所有相应的属性和方法 例如 Employee 类将创建实际的 Print 方法 而 Person 类仅定义必须存在 Print 方法 Person 类中没有与 Print 方法相关联的代码 使用抽象类的原因有多种 对于强制子类设计人员实现应用程序通常所需的所有接口 抽象类非常有用 您可以在不破坏客户端应用程序的情况下向子类添加新方法 这是使用接口所无法实现的 可以在基类中提供许多默认实现方法 从而减少子类需要完成的工作量

接口继承 创建抽象类时 请使用关键字 Interface 而不是 Class 为接口命名 然后定义需要子类实现的所有属性和方法 这是因为基类中没有可以实现的属性和方法 它只包含一般数据 而不包含方法 您所创建的只是一个合约 它规定所有使用此接口的子类都必须遵循一定的规则

现在 请在已创建的项目中添加一个新类 从 Visual Studio 菜单中 单击 Project(项目) 然后单击 Add Class(添加类) 在类中添加以下代码

Interface PersonProperty FirstName() As StringProperty LastName() As String

Sub Print()Sub Talk()End Interface

您会发现 您定义属性和子过程的方法与您通常定义这些属性和过程的方法一样 唯一的差别在于 您没有为它们编写任何代码 现在来看看如何在类定义中使用此接口

在上一步骤创建的类文件中添加以下代码

Public Class EmployeeImplements PersonPrivate mstrFirstName As StringPrivate mstrLastName As StringProperty FirstName() As String _Implements Person FirstNameGetReturn mstrFirstNameEnd GetSetmstrFirstName = ValueEnd SetEnd PropertyProperty LastName() As String _Implements Person LastNameGetReturn mstrLastNameEnd GetSetmstrLastName = ValueEnd SetEnd PropertySub Print() Implements Person Print 在此处添加一些代码 End Sub

Sub Talk() Implements Person Talk 在此处添加一些代码End SubEnd Class

在 Employee 类定义之后的第一行是 Implements Person 此关键字表示您要遵守 Person 接口中定义的合约 现在您可以定义该合约中的所有属性和方法 在每一个 Property 语句后面 都必须包含 Implements 关键字 并且必须指定接口的名称和您正在使用的方法/属性的名称(两个名称之间有一个点 [ ]) Visual 将跟踪每一个接口 在所有接口创建完毕之前 您不能编译应用程序 如果要运行代码 则需要创建相应的子过程 因为在上面的示例中这些子过程被保留为空 创建所有子过程后 您就可以与您通常创建并使用任何其他对象一样 声明并使用新的 Employee 对象了

选择要使用的继承类型 有时候很难决定到底是使用实现继承还是使用接口继承 很多情况下 可能两种继承都会用到 但都只涉及一小部分 例如 您可能需要在 Line 类中添加必须被子类覆盖的方法定义 在过程定义中使用 MustOverride 关键字即可实现此操作

Public MustOverride Sub Init()将此定义添加到类中以后 其作用类似于一个接口 在子类中 必须定义 Init 方法 并且该方法必须使用 Overrides 关键字 以下是如何定义 Init 方法的示例

Public Overrides Sub Init()mstrDelim = mstrLine = 测试行 End Sub同样 请记住使用 Overrides 关键字 该关键字用于通知编译器此方法将覆盖父类中的 Init 方法

注意 Microsoft NET 框架的联机帮助中提供了设计指南 可以帮助您决定要使用的继承类型 阻止继承在某些情况下 您可能不希望其他类继承您的类 如果是这样 您可以使用关键字 NotInheritable 来阻止类的继承

Public Class NotInheritable Employee 类定义End ClassVisual Basic 以来的新增功能

使用 Visual Basic NET 您可以继承 NET 框架包含的所有类 您可以创建自己的类 使这些类继承现有的类 并通过对代码进行简单更改来添加或删除功能

lishixinzhi/Article/program/net/201311/11397


本文标题:vb.net继承抽象类 vba类继承
分享URL:http://azwzsj.com/article/dojheds.html