77范文网 - 专业文章范例文档资料分享平台

C#入门经典第三版(最新)(7)

来源:网络收集 时间:2019-03-27 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:或QQ: 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

为抽象总是希望被继承的。

C#还提出了密封方法(sealed method)的概念。方法使用sealed修饰符,称该方法是一个密封方法。在派生类中,不能覆盖基类中的密封方法。 1.14 接口

与类一样,在接口中可以定义一个和多个方法、属性、索引指示器和事件。但与类不同的是,接口中仅仅是它们的声明,并不提供实现。因此接口是函数成员声明的集合。如果类或结构从一个接口派生,则这个类或结构负责实现该接口中所声明的所有成员。一个接口可以从多个接口继承,而一个类或结构可以实现多个接口。由于C#语言不支持多继承,因此,如果某个类需要继承多个类的行为时,只能使用多个接口加以说明。 1.14.1 接口声明

接口声明是一种类型声明,它定义了一种新的接口类型。接口声明格式如下: 属性 接口修饰符 interface 接口名:基接口{接口体}

其中,关键字interface、接口名和接口体时必须的,其它项是可选的。接口修饰符可以是new、public、protected、internal和private。例子: public interface IExample {//所有接口成员都不能包括实现

string this[int index] {get;set;}//索引指示器声明 event EventHandler E;//事件声明 void F(int value);//方法声明 string P { get; set;}//属性声明 }

声明接口时,需注意以下内容:

? 接口成员只能是方法、属性、索引指示器和事件,不能是常量、域、操作符、构造函数或析构函数,不能包含任何静态成员。

? 接口成员声明不能包含任何修饰符,接口成员默认访问方式是public。 1.14.2 接口的继承

类似于类的继承性,接口也有继承性。派生接口继承了基接口中的函数成员说明。接口允许多继承,一个派生接口可以没有基接口,也可以有多个基接口。在接口声明的冒号后列出被继承的接口名字,多个接口名之间用分号分割。例子如下: using System;

interface IControl { void Paint(); }

interface ITextBox:IControl//继承了接口Icontrol的方法Paint() { void SetText(string text); }

interface IListBox:IControl//继承了接口Icontrol的方法Paint() { void SetItems(string[] items); }

interface IComboBox:ITextBox,IListBox {//可以声明新方法 }

上面的例子中,接口ITextBox和IListBox都从接口IControl中继承,也就继承了接口IControl的Paint方法。接口IComboBox从接口ITextBox和IListBox中继承,因此它应该

继承了接口ITextBox的SetText方法和IListBox的SetItems方法,还有IControl的Paint方法。

1.14.3 类对接口的实现

前面已经说过,接口定义不包括函数成员的实现部分。继承该接口的类或结构应实现这些函数成员。这里主要讲述通过类来实现接口。类实现接口的本质是,用接口规定类应实现那些函数成员。用类来实现接口时,接口的名称必须包含在类声明中的基类列表中。

在类的基本概念一节中,定义一个描述个人情况的类Person,从类Person可以派生出其它类,例如:工人类、公务员类、医生类等。这些类有一些共有的方法和属性,例如工资属性。一般希望所有派生类访问工资属性时用同样变量名。该属性定义在类Person中不合适,因为有些人无工资,如小孩。如定义一个类作为基类,包含工资属性,但C#不支持多继承。可行的办法是使用接口,在接口中声明工资属性。工人类、公务员类、医生类等都必须实现该接口,也就保证了它们访问工资属性时用同样变量名。例子如下: using System;

public interface I_Salary//接口 { decimal Salary//属性声明 { get; set; } }

public class Person

{?//见1.9.2属性节Person类定义,这里不重复了。 }

public class Employee:Person,I_Salary//Person类是基类,I_Salary是接口 {//不同程序员完成工人类、医生类等,定义工资变量名称可能不同 private decimal salary; public new void Display() { base.Display();

Console.WriteLine(\薪金:{0} \}

//工人类、医生类等都要实现属性Salary,保证使用的工资属性同名 public decimal Salary { get

{ return salary;} set

{ salary=value;} } }

public class Test

{ public static void Main() { Employee S=new Employee(); S.Name=\田七\修改属性Name S.Age=20;//修改属性Age

S.Salary=2000;//修改属性Salary S.Display();

} }

如果类实现了某个接口,类也隐式地继承了该接口的所有基接口,不管这些基接口有没有在类声明的基类表中列出。因此,如果类从一个接口派生,则这个类负责实现该接口及该接口的所有基接口中所声明的所有成员。 1.15 代表

在这里要介绍的是C#的一个引用类型----代表(delegate),也翻译为委托。它实际上相当于C语言的函数指针。与指针不同的是C#中的代表是类型安全的。代表类声明格式如下: 属性集 修饰符 delegate 函数返回类型 定义的代表标识符(函数形参列表);

修饰符包括new、public、protected、internal和private。例如我们可以声明一个返回类型为int,无参数的函数的代表MyDelegate:

public delegate int MyDelegate();//只能代表返回类型为int,无参数的函数

声明了代表类MyDelegate,可以创建代表类MyDelegate的对象,用这个对象去代表一个静态方法或非静态的方法,所代表的方法必须为int类型,无参数。看下面的例子: using System;

delegate int MyDelegate();//声明一个代表,注意声明的位置 public class MyClass

{ public int InstanceMethod()//非静态的方法,注意方法为int类型,无参数 { Console.WriteLine(\调用了非静态的方法。\return 0; }

static public int StaticMethod()//静态方法,注意方法为int类型,无参数 { Console.WriteLine(\调用了静态的方法。\return 0; } }

public class Test

{ static public void Main () { MyClass p = new MyClass();

//用new建立代表类MyDelegate对象,d中存储非静态的方法InstanceMethod的地址 MyDelegate d=new MyDelegate(p.InstanceMethod);//参数是被代表的方法 d();//调用非静态方法

//用new建立代表类MyDelegate对象,d中存储静态的方法StaticMethod的地址 d=new MyDelegate(MyClass.StaticMethod);//参数是被代表的方法 d();//调用静态方法 } }

程序的输出结果是: 调用了非静态的方法。 调用了静态的方法。 1.16 事件

事件是C#语言内置的语法,可以定义和处理事件,为使用组件编程提供了良好的基础。 1.16.1 事件驱动

Windows操作系统把用户的动作都看作消息,C#中称作事件,例如用鼠标左键单击按钮,发

出鼠标单击按钮事件。Windows操作系统负责统一管理所有的事件,把事件发送到各个运行程序。各个程序用事件函数响应事件,这种方法也叫事件驱动。

C#语言使用组件编制Windows应用程序。组件本质上是类。在组件类中,预先定义了该组件能够响应的事件,以及对应的事件函数,该事件发生,将自动调用自己的事件函数。例如,按钮类中定义了单击事件Click和单击事件函数。一个组件中定义了多个事件,应用程序中不必也没必要响应所有的事件,而只需响应其中很少事件,程序员编制相应的事件处理函数,用来完成需要响应的事件所应完成的功能。现在的问题是,第一,如何把程序员编制的事件处理函数和组件类中预先定义的事件函数联系起来。第二,如何使不需响应的事件无动作。这是本节要节的解决问题。 1.16.2 事件的声明

在C#中,事件首先代表事件本身,例如按钮类的单击事件,同时,事件还是代表类引用变量,可以代表程序员编制的事件处理函数,把事件和事件处理函数联系在一起。下面的例子定义了一个Button组件,这个例子不完整,只是说明问题。实际在C#语言类库中已预定义了Button组件,这里的代码只是想说明Button组件中是如何定义事件的。例子如下: public delegate void EventHandler(object sender,EventArgs e);//代表声明 //EventHandler可以代表没有返回值,参数为(object sender,EventArgs e)的函数 public class Button:Control//定义一个按钮类Button组件 {?//按钮类Button其它成员定义

public event EventHandler Click;//声明一个事件Click,是代表类引用变量 protected void OnClick(EventArgs e)//Click事件发生,自动触发OnClick方法 { if(Click!=null)//如果Click已代表了事件处理函数,执行这个函数 Click(this,e); }

public void Reset() { Click=null;} }

在这个例子中,Click事件发生,应有代码保证(未列出)自动触发OnClick方法。Click是类Button的一个事件,同时也是代表EventHandler类的引用变量,如令Click代表事件处理函数,该函数完成Click事件应完成的功能,Click事件发生时,执行事件处理函数。 1.16.3 事件的预订和撤消

在随后的例子中,我们声明了一个使用Button类的登录对话框类,对话框类含有两个按钮:OK和Cancel按钮。

public class LoginDialog: Form//登录对话框类声明 { Button OkButton; Button CancelButton;

public LoginDialog()//构造函数

{ OkButton=new Button();//建立按钮对象OkButton //Click代表OkButtonClick方法,注意+=的使用

OkButton.Click+=new EventHandler(OkButtonClick); CancelButton=new Button();//建立按钮对象OkButton

CancelButton.Click += new EventHandler(CancelButtonClick); }

void OkButtonClick(object sender, EventArgs e) {?//处理OkButton.Click事件的方法

}

void CancelButtonClick(object sender, EventArgs e) {?//处理CancelButton.Click事件的方法 } }

在例子中建立了Button类的两个实例,单击按钮事件Click通过如下语句和事件处理方法联系在一起:OkButton.Click+=new EventHandler(OkButtonClick),该语句的意义是使OkButton.Click代表事件处理方法OkButtonClick,这样只要Click事件被触发,事件处理方法OkButtonClick就会被自动调用。撤消事件和事件处理方法OkButtonClick的联系采用如下语句实现:OkButton.Click-=new EventHandler(OkButtonClick),这时,OkButton.Click就不再代表事件处理方法,Click事件被触发,方法OkButtonClick就不会被调用了。务必理解这两条语句的用法。使用Visual Studio.Net集成环境可以自动建立这种联系,在自动生成的代码中包括这两条语句。 1.17 索引指示器

在C#语言中,数组也是类,比如我们声明一个整型数数组:int[] arr=new int[5],实际上生成了一个数组类对象,arr是这个对象的引用(地址),访问这个数组元素的方法是:arr[下标],在数组类中,使用索引访问元素是如何实现的呢?是否可以定义自己的类,用索引访问类中的数据成员?索引指示器(indexer)为我们提供了通过索引方式方便地访问类的数据成员的方法。

首先看下面的例子,用于打印出小组人员的名单: using System class Team

{ string[] s_name = new string[2];//定义字符串数组,记录小组人员姓名 public string this[int nIndex]//索引指示器声明,this为类Team类的对象 { get//用对象名[索引]得到记录小组人员姓名时,调用get函数 { return s_name[nIndex]; }

set//用对象名[索引]修改记录小组人员姓名时,调用set函数 { s_name[nIndex] =value;//value为被修改值 } } }

class Test

{ public static void Main() { Team t1 = new Team(); t1[0]=\张三\t1[1]=\李斯\

Console.WriteLine(\,{1}\} }

显示结果如下:张三,李斯 1.18 名字空间

一个应用程序可能包含许多不同的部分,除了自己编制的程序之外,还要使用操作系统或开发环境提供的函数库、类库或组件库,软件开发商处购买的函数库、类库或组件库,开发团

百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库C#入门经典第三版(最新)(7)在线全文阅读。

C#入门经典第三版(最新)(7).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.77cn.com.cn/wenku/zonghe/545986.html(转载请注明文章来源)
Copyright © 2008-2022 免费范文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ: 邮箱:tiandhx2@hotmail.com
苏ICP备16052595号-18
× 注册会员免费下载(下载后可以自由复制和排版)
注册会员下载
全站内容免费自由复制
注册会员下载
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: