当前位置:文档之家› 包、接口和事件

包、接口和事件

包、接口和事件
包、接口和事件

C#里的委托和事件实现Observer

C#里的委托和事件实现Observer 一、委托的简介 1、委托的声明: delegate HandlerName ([parameters]) 例如: public delegate void PrintHandler(string str); 委托声明定义了一种类型,它用一组特定的参数以及返回类型来封装方法。对于静态方法,委托对象封装要调用的方法。对于实例方法,委托对象同时封装一个实例和该实例上的一个方法。如果您有一个委托对象和一组适当的参数,则可以用这些参数调用该委托。 2、委托的使用: using System; public class MyClass { public static void Main() { PrintStr myPrinter = new PrintStr(); PrintHandler myHandler = null; myHandler += new PrintHandler(myPrinter.CallPrint); // 将委托链接到方法,来实例化委托 if(myHandler!=null) myHandler("Hello

World!"); // 调用委托,相当于匿名调用委托所链接的方法 Console.Read(); } } public delegate void PrintHandler(string str); // 声明委托类型 public class PrintStr { public void CallPrint(string input) { Console.WriteLine(input); } } 在C#中使用委托方法: ·创建委托所使用的方法必须和委托声明相一致(参数列表、返回值都一致) ·利用 +=、-=来进行委托的链接、取消链接或直接使用https://www.doczj.com/doc/9a19061804.html,bine和Delegate.Remove方法来实现 ·可以使用MulticastDelegate的实例方法GetInvocationList()来获取委托链中所有的委托

06接口与内部类

1.给出如下层次图和程序片段,下列哪个命题是正确的?【选择一项】 Animal Mammal Dog Cat Raccoon Elephant (implements) (implements) ( Washer ) ( Washer ) 1. Cat sunflower; 2. Washer wawa; 3. Elephant pogo; 4. 5. sunflower = new Cat(); 6. wawa = sunflower; 7. pogo = (Elephant)wawa; A第6行导致程序编译失败。 B第7行导致程序编译失败。 C编译通过但是第7行会抛出异常。 D D.以上结果均不是。 2.下列那些命题是不正确的?【选择两项】 A JAVA程序通过接口实现多重继承。 B JAVA里面所有的异常、接口或者其他类,都从Object类扩展而来。C构造方法可以用private修饰,并且可以抛出异常。 D装箱类一共有六个。 3.下列哪些命题为假?【选择三项】 A静态方法只能被类调用,不能被实例调用。 B所有数据类型都可以用==判断恒等。 C equals()方法成立的地方,==也一定成立。 D包含抽象方法的类一定是抽象类。 4.试图编译、运行下列程序,结果是什么?【选择一项】 //Foo.java interface Foo { int k = 0; } //Test.java public class Test implements Foo {

public static void main(String[] args) { int i; Test test = new Test(); i = test.k; i = Test.k; i = Foo.k; } } A编译失败。 B编译成功。 C运行异常。 D以上结果均不是。 5.下列修饰符不能用于顶层类的是哪个【选择一项】。 A public B private C abstract D final 6.哪些命题为真?【选择两项】 A在Java中,implement用于实现接口。 B非抽象类的子类可以声明为abstract。 C超类的所有成员都将由子类继承。 D final类不可以是抽象的。 E如果类中的所有成员都声明为private,则该类不能声明为public。 7.哪些关于接口的命题为真?【选择两项】 A接口允许多重实现接口。 B接口可以被任意数目的其他接口扩展。 C接口可以扩展任意数目的其他接口。 D接口的成员变量从来不会是static。 E接口的方法总会被声明为static。 8.给出下面的程序: 1. interface Base { 2. boolean m1 (); 3. byte m2(short s); 4. } 下面哪两段代码将编译通过? 【选择两项】 A interface Base2 implements Base {} B abstract class Class2 extends Base {

C#委托及事件

C#委托及事件 在C#中,委托(delegate)是一种引用类型,在其他语言中,与委托最接近的是函数指针,但委托不仅存储对方法入口点的引用,还存储对用于调用方法的对象实例的引用。 简单的讲委托(delegate)是一种类型安全的函数指针,首先,看下面的示例程序,在C++中使用函数指针。 首先,存在两个方法:分别用于求两个数的最大值和最小值。 int Max(int x,int y) { return x>yx:y; } int Min(int x,int y) { return x } 上面两个函数的特点是:函数的返回值类型及参数列表都一样。那么,我们可以使用函数指针来指代这两个函数,并且可以将具体的指代过程交给用户,这样,可以减少用户判断的次数。 下面我们可以建立一个函数指针,将指向任意一个方法,代码如下所示: 建立一个委托类型,并声明该委托可以指向的方法的签名(函数原型)delegate void MyDelegate(int a,int b); 2.建立一个委托类的实例,并指向要调用的方法 用委托类实例调用所指向的方法 int c=md(4,5); 下面通过实例来演示C#中委托的使用。

案例操作020601:利用委托实现方法的 动态调用 首先,添加如下控件: 两个RadioButton,分别用来让用户选 择求最大值以及求最小值 二个TextBox,用来输入两个操作数 一个TextBox,用来显示运算结果 一个Button,用来执行运算 界面如下图所示: 下一步,在窗口中添加两个方法:Max,Min,这两方法的代码如下: int Max(int x,int y) { return x>yx:y; } int Min(int x,int y) { return x } 窗口中的代码,如下图所示:

C#实验委托、事件与继承

实验二委托、事件与继承 一、实验目的 1.掌握扩展函数的用法; 2.掌握C#委托和事件的用法; 3.掌握C#继承和多态概念; 4.掌握常用接口的使用方法。 二、实验内容 (实验过程中编写的程序复制到本文件中,下课整理后上交) 1.编写一个静态类MyExtensions,扩展.NET Framework基本类型的功能。 1)定义一个扩展方法IsPalindrome,扩展string类的功能,来判断字符串是否为回文(指顺读和倒读内容都一样的文本)。为提高程序效率,该方法中不能直接调用Reverse方法。 2)定义一个扩展方法ReverseDigits,允许int将自己的值倒置,例如将整型1234调用ReverseDigits,返回结果为4321。 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace experiment2 { static class MyExtensions { public static bool IsPalindrome(this string str) { for(int i=0;i

} public static int ReverseDigits(this int num) { int j=0,Reverse_num = 0; int[] a = new int[10];//数组中元素的数量应该是可变的 for(int i=0;;i++)//注意 { if (num == 0) // 1 ? break; a[i] = num % 10; j++; num /= 10; } for(int i=0;i

类与接口的关系理解

(类是对所有事物公共的概念进行抽象的描述。)类描述了一系列在概念上有相同含义的对象,并为这些对象统一定义了编程语言上的属性和方法。对象就是一个类的实例(是某一类的具体化实例),每一个类都是具有某些共同特征的对象的抽象。 public class Car { public int number; //编号 public string color; //颜色 private string brand; //厂家 } 析构函数(前面加一个~符号): class Program { ~Program() //析?构1函?¥数oy { Console.WriteLine("析?构1函?¥数oy自á?动?¥调ì??用??"); //输o?出?一°?个?字á?符¤?串?? } static void Main(string[] args) { Program program = new Program(); //实o|ì例¤y化?¥Program对?象¨?} 接口是一种用来定义程序的协议,它描述可属于任何类或结构的一组相关行为。接口可由方法、属性、事件和索引器或这4种成员类型的任何组合构成,但不能包含字段。 C#中的类只支持单继承,但基于多继承给程序员带来的诸多方便与好处,所以通过接口可以实现多继承的功能。(以I开头命名接口名称) 一个接口实现多个类: 一个派生子类可以实现多个接口(多个接口用,隔开): class Program : IPeople, ITeacher, IStudent//多¨¤接¨?口¨2继¨?承D { string name = ""; string sex = ""; ///

///姓?名? /// public string Name { get { return name; }

C#委托事件详解

C# 中的委托和事件 引言 委托和事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易。它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每次见到委托和事件就觉得心里别(biè)得慌,混身不自在。本文中,我将通过两个范例由浅入深地讲述什么是委托、为什么要使用委托、事件的由来、.Net Framework中的委托和事件、委托和事件对Observer设计模式的意义,对它们的中间代码也做了讨论。 将方法作为方法的参数 我们先不管这个标题如何的绕口,也不管委托究竟是个什么东西,来看下面这两个最简单的方法,它们不过是在屏幕上输出一句问候的话语: public void GreetPeople(string name) { // 做某些额外的事情,比如初始化之类,此处略 EnglishGreeting(name); } public void EnglishGreeting(string name) { Console.WriteLine("Morning, " + name); } 暂且不管这两个方法有没有什么实际意义。GreetPeople用于向某人问好,当我们传递代表某人姓名的name参数,比如说“Jimmy”,进去的时候,在这个方法中,将调用EnglishGreeting方法,再次传递name参数,EnglishGreeting则用于向屏幕输出“Morning, Jimmy”。

现在假设这个程序需要进行全球化,哎呀,不好了,我是中国人,我不明白“Morning”是什么意思,怎么办呢?好吧,我们再加个中文版的问候方法: public void ChineseGreeting(string name){ Console.WriteLine("早上好, " + name); } 这时候,GreetPeople也需要改一改了,不然如何判断到底用哪个版本的Greeting问候方法合适呢?在进行这个之前,我们最好再定义一个枚举作为判断的依据: public enum Language{ English, Chinese } public void GreetPeople(string name, Language lang){ //做某些额外的事情,比如初始化之类,此处略 swith(lang){ case Language.English: EnglishGreeting(name); break; case Language.Chinese: ChineseGreeting(name); break; } } OK,尽管这样解决了问题,但我不说大家也很容易想到,这个解决方案的可扩展性很差,如果日后我们需要再添加韩文版、日文版,就不得不反复修改枚举和GreetPeople()方法,以适应新的需求。 在考虑新的解决方案之前,我们先看看 GreetPeople的方法签名:

第五章 Java类的继承、包及接口

第5章类的继承、包及接口 在前一章的实验中已经了解了类的基本构成、对象的创建及重载方法的应用等。本章实验的任务主要是了解Java中类的继承、类包、内部类、匿名类及接口的基本构成及应用。 5.1 实验一:类的继承 1. 实验目的 1)正确理解Java中类继承基本概念及思想; 2)基本掌握继承类和被继承类(子类和父类)之间的关系,正确地创建继承类。 2. 实验要求 正确地划分类,根据类之间的关系,确定父类和子类,掌握覆盖方法的应用,完成类程序的编写与调试。 3. 实验内容 在上一章的实验中,建立了公司职员信息类,现在需要处理职员的工资信息,建立职员工资类。 实验示例5.1.1 创建职员工资类Payroll类。 实现该示例的方法步骤如下: ⑴首先分析一下该类的构成 工资信息应包括职工的基本信息,因此可以把Employers类作为Payroll类的父类,Payroll类继承了父类所有的成员变量和方法,因此在Payroll类中需要定义的内容是: ①成员变量 对于工资信息项应该包括basicWage(基本工资)、positionWage(职位工资)、extraWage(附加工资)、other(其他补贴)等等。它们均可声明为int (整数类型)。 ②成员方法 常常需要显示或获得全部或某些项工资的信息,因此需要定义如下一些方法: display() 显示工资的全部信息; display(int value) 显示一项工资额; display(int value1, int value2) 显示两项工资额。 ③构造方法 如前所述,一个类能够有多个构造对象方法,视需要而定。对Payroll类来说可以给出两个构造方法: Payroll () 构造无名对象; Payroll(String ID,String name,String sex,String birthday,String home,String address, String number,int basicWage,int positionWage,int extraWage,int other) 构造一般对象。 ⑵根据上边分析和描述,按照类的构成,给出如下类程序代码: public class Payroll extends Employers { int basicWage; //定义基本工资 int positionWage; //定义职位工资 int extraWage; //定义附加工资

唯一看明白额委托与事件讲解

一、在控制台下使用委托和事件 我们都知道,C#中有“接口”这个概念,所谓的“接口”就是定义一套标准,然后由实现类来具体实现其中的方法,所以说“接口,是一组类的抽象”。同样道理,我们可以将“委托”理解为“方法的抽象”,也就是说定义一个方法的模板,至于这个方法具体是怎么样的,就由方法自己去实现。 我们知道接口的最大好处就是可以实现多态,同理,“委托”是可以实现方法的多态,当我们想调用某个具体方法的时候,我们不直接调用这个方法,而是去调用这个委托。当然,我们必须在具体方法和委托之间建立某种关联。 下面我们来看例子。 首先,我们定义一个委托: public delegate void SaySomething(string name); 这跟抽象方法的语法格式很相似,只是多了一个关键字delegate。既然是对方法的一种抽象,那么我们最关注的当然就是方法的返回值以及方法的参数了。所以上面红色的部分就是我们定义出来的一个规矩,如果某个方法想委托我去做事,那么请你遵循我的规矩,就是返回值为void,参数为一个字符串。我们这个委托的含义是,当某个人来了,就向他说点东西。 好,既然我们已经定义了这个规矩,下面我们就定义具体的方法了。 public void SayHello(string name) { Console.WriteLine("Hello," + name + "!"); } public void SayNiceToMeetYou(string name) { Console.WriteLine("Nice to meet you," + name + "!"); } 我们这里一共定义了两个方法,一个是向某人说Hello,另一个是向某人说Nice to meet you。我们看到,这里定义的两个方法的返回值和参数跟我们前面定义的“委托”是一致的。 接下来,我们来看事件。 public event SaySomething come;

实验七 抽象类、包与接口

实验七抽象类、接口与包 一、实验目的 1、熟练掌握抽象类abstract的概念。 2、熟练掌握接口interface的概念。 3、熟练包package的概念以及编译运行的方法。 二、实验内容与要求 1.编写求解几何图形(如三角形,矩型,圆,多边型)的周长、面积的应用程序,要求用到继承、多态、抽象类、接口、内部类等面向对象程序设计技术的特点。 2、重写上面的程序,要求三角形,矩型,圆,多边型的类放到不同的包中,用包的技术组织程序的设计。同时要求程序能从键盘上接受数据以便求解不同的几何图形的周长面积。提示:从键盘上输入双精度数的一种方法(程序片段) …… public static void main(String args[]) throws IOException { BufferedReader keyin=new BufferedReader(new InputStreamReader(System.in)); String x; x=keyin.readLine(); double a=Double.parseDouble(x); …… 3.练习https://www.doczj.com/doc/9a19061804.html,ng.Class类的使用,通过一个对象返回一个Class对象,如何获取一个类的名称,如何使用class生成一个类的对象。获取类的描述信息。 4.从命令行输入一个正整数,用递归的方法求出每位数字上的累加和 5、编写一个应用程序,实现以下功能: ①声明一个接口(Calculability),接口中包含一个方法area()。 ②声明一个三角形类继承该接口,类名为Triangle,类中包含两个变量、一个带参数年的构造方法和一个计算三角形面积的方法: 三角形的底边长w 三角形的高h 构造方法Triangle(double width,double height)。 计算三角形面积的方法area(),该方法覆盖接口(Calculability)的同名方法,计算三角形的面积(w*h/2)。 ③声明一个锥体类(Taper),包含一个接口对象bottom(锥体的底)和一个变量(锥体的高)height,一个带参数的构造方法,一个换底方法getbottom(),一个锥体体积的计算方法volume()。 ④声明一个主类Exp6_1,在主方法中声明接口和锥体类的对象,输出锥体的底面积和锥体的体积(bottom*height/3)。

第六讲类、对象和接口(二)

第六讲类、对象和接口(二) 1类的继承 继承是类的另一个特性。继承的意义在于:我们重复使用或更改现成的类的方法,也可以加入新的数据成员以及新的方法,以满足新环境的需要。这种技术是所有面向对象的编程语言的一个基本特征。 让我们来看一个例子:前面我们定义了一个Employee类,这只是普通员工,现在我们要定义一个经理类。经理也是员工的一种,所以Employee类中的数据和方法他也应该有;但经理又不同于普通员工,经理有秘书,而且涨工资的时候还要加上分红。怎么办?我们要不要从头开始写一个经理类? 有了继承的技术,我们可以在Employee类的基础上,编写我们的Manager类。程序如下: package teach4; import java.util.Date; class Manager extends Employee { private String secretaryName; public Manager(String n, double s, int d) { super(n, s, d); secretaryName = ""; } public void raiseSalary(double byPercent) { // add 1/2% bonus for every year of service Date today = new Date(2001,1,1); double bonus = 0.5 * (today.getYear()- getHireYear()); super.raiseSalary(byPercent + bonus); } public void setSecretaryName(String n) { secretaryName = n; } public String getSecretaryName() { return secretaryName; } } 我们以这个例子为例,学习继承的用法。 首先,请注意这个类的头部有些不同:class Manager extends Employee;其中,关键字extends是扩展的意思,表明Manager类是从Employee类继承而来。我们把Employee叫做父类或者超类,把Manager叫做子类或者衍生类。一般来说,子类比父类有更多的功能。 Manager的构造方法中有个语句:super(n, s, d),super是一个关键字,意思是调用父

java实验报告 接口、泛型、枚举、内部类与异常

实验报告 课程名称: Java程序设计成绩评定: 实验项目名称:接口、泛型、枚举、内部类与异常指导教师: 学生姓名:学号:专业班级: 实验项目类型:基础实验地点:实验时间: 一、实验目的与要求: 1、理解接口的定义与实现; 2、知道泛型、枚举型与内部类的基本应用; 3、掌握常用异常的抛出与捕获及处理. 二、实验环境:(硬件环境、软件环境) 1.硬件环境:奔ⅣPC。 2.软件环境:Windows XP 操作系统,JDK6.0。 三、实验内容:(原理、操作步骤、程序代码等) 任务: 1、按照要求完成下述接口及实现类的程序 1)定义名称为PCI()的接口,包括启动的方法start和关闭的方法stop; 2)定义名称为NetworkCard 的类表示网卡,实现PCI接口,并且其在实现start 方法时输出“sending data……”,在实现stop方法时输出“network stop.” 3)定义名称为SoundCard 的类表示声卡,实现PCI接口;并且其在实现start 方法时输出“dudu……”,在实现stop方法时输出“sound stop.” 4)定义名称为MainBoard 的类表示主板,包含方法public void usePCICard(PCI p),在方法体内通过p来启动和关闭组件; 5)定义一个包含main方法的Test类,在main方法内创建一个MainBoard 对 象用mb来引用,创建一个NetworkCard对象用nc来引用,创建一个 SoundCard对象用sc来引用,分别通过mb来使用usePCICard(PCI p)启动声 卡和网卡。 2、泛型类程序的调试 调试教材P165的程序8-2,写出程序运行结果,理解泛型类的工作机理及应用。 3、调试运行内部类程序: 在类内部再定义另外一个类,这个另外定义的类就叫内部类。调试教材P171-172程序8-3,写出程序运行结果,理解内部类的定义方法与应用。 4、异常抛出与捕获编程与调试 先调试教材P182、183中的程序9-2和9-3,写出调试结果。然后,自己编写一个能抛出并捕获、处理NullPointerException、NumberFormanException多异常的程序,并调试后写出运行结果。

C#委托与事件以及应用

这些很重要在MVC EF4.1 里都会有很多拉姆达表达式的影子在做组件开发用户控件开发事件的运用一定也是少不了的稍微深入点儿的说用于两个对象之间的通讯用来解耦用委托事件是很不错的选择而设计模式里的观察者模式也是基于委托事件的应用还有做winform 开发的里的线程WPF SL 的异步调用等都是有这委托的影子的所以这个还是很重要的。也是一定要掌握的~ 希望通过这篇文章能让大家更加了解委托以及如何运用~ 一.委托以及延伸 先看下MSDN 的介绍吧~------ delegate 通俗的说委托就是可以实现把方法做为变量来传递 1.先写个最简单的委托的用法 静态的和非静态方法的 结果会输出 您好wlf

Hello wlf 这是最原始的委托 2. 进化为匿名方法 声明完委托后还要声明方法是不是很麻烦如果不声明方法用匿名方法可以帮我们看 代码减少了很多吧~ 3.再进化为拉姆达表达式 上面的虽然简单了不少但是还能更简单的用拉姆达表达式~ 看这就是拉姆达表达式的演变一定要会这个~ 因为在EF LINQ 等有很多用拉姆达表达式的~ 4.用Action 和Func继续简化 上面的代码以及很简单了但是还有个很不爽的一点~ 要声明委托!可以不声明么?当然可以~ 先看MSDN介绍Action和Func 通俗的讲这两个都是用来帮你声明委托 Action 用于帮你声明没用返回值的委托Func则是有返回值的最后一个参数为返回值

看~ 以前的版本总是要声明一个HelloWorld 的委托现在只有两行代码就可以了下面顺便掩饰了有返回值的func 的例子。第一个参数是传递 参数的类型第二个是返回值的类型~ 这里说下这俩函数都有16个重载~ 所以多个参数是没问题的~ 5.说说委托的好处 委托的好处应用文章开始已经说了很多了这里就拿文章开头的例子体会下委托的好处 当我们再多一种语言来问好时只需增加一种Action 即可而不需要改动sayHello 方法否则这里将充满了if else 的判断 6.工作里的应用 再LINQ 或EF 里都有个很重要的数据刷选的功能WHERE 它的参数就是Func 直接上代码自己看注释~

C#面向对象编程-委托和事件习题

C#面向对象编程-委托和事件 1.一个委托在某一时刻()指向多个方法。 a)可以 b)不可以 2.将事件通知其他对象的对象称为() a)发布方 b)订户 c)通知方 3.以下的C#代码: using System; using System.Theading; class App{ Public static void Main() { Timer timer = new Timer(new TimerCallback(CheckStatus),null,0,2000); Console.Read(); } Static void CheckStatus(Object state) { Console.WriteLine(“正在运行检查……”); } } 在使用代码创建定时器对象的时候,同时指定了定时器的事件,程序运行时将每隔两秒钟打印一行“正在运行检查……”,因此,TimerCallback是一个()选一项 a)委托 b)结构 c)函数 d)类名 4.阅读以下C#代码 Namespace tevent { public delegate void notify5(); class eventTest { public void Raise5(int I) { if(I%3==1) Got5(); }

public event notify5 Got5; } class Handlers { public static void Method1() { Console.WriteLine("时间处理完成"); } } class class10 { static void Main(String[] args) { eventTest eObj=new eventTest(); eObj.Got5+=new notify5(Handlers.Method1); for(int cnt=0;cnt<5;cnt++) { int y=cnt*2+1; eObj.Raise5(y); } Console.WriteLine(); } } 代码允许的结果为()。(选择一项) A)控制台窗口不能出任何信息。 B)在控制台窗口输出“时间处理完成”1次 C)在控制台窗口输出“时间处理完成”2次 D)在控制台窗口输出“时间处理完成”5次 5.一个委托在某一时刻()指向多个方法。 A.可以 B.不可以 6.将事件通知其他对象的对象称为() A.发布方 B.订户 C.通知方 7.声明一个委托public delegate int myCallBack(int x); 则用该委托产生的回调方法的原型应该是() A. void myCallBack(int x) B. int receive(int num) C. string receive(int x) D. 不确定的

细说C 委托

细说C#委托 委托是什么 在正式介绍委托之前,我想下看看生活中委托的例子——生活中,如果我们需要打官司,在法庭上是由律师为我们辩护的,然而律师执行的是当事人的陈词,这时候律师就是一个委托对象,当事人委托律师这个对象去帮自己辩护。这就是我们生活中委托的例子的。然而C#中委托的概念也就好比律师对象(从中可以得出委托是一个类,因为只有类才有对象的概念,从而也体现了C#是面向对象的语言)。 介绍完生活中委托是个什么后,现在就看看C#中的委托怎样和生活中的对象联系起来的,C#中的委托相当于C++中的函数指针(如果之前学过C++就知道函数指针是个什么概念的了),函数指针是用指针获取一个函数的入口地址,然后通过这个指针来实现对函数的操作。C#中的委托相当于C++中的函数指针,也就说两者是有区别的:委托是面向对象的,类型安全的,是引用类型(开始就说了委托是个类),所以在使用委托时首先要声明委托类型——>有一个方法包含了执行的代码——>创建一个委托实例——>调用该委托实例。下面就具体看下如何使用委托的: 1、声明委托类型,委托被声明为: public delegate void AddDelete (int a,int b); 上述代码指出,如果要创建AddDelete的一个实例,需要带两个参数(两个都是int 类型)的方法,而且该方法需要有一个void返回类型(该方法什么都不返回)。 2、有一个方法包含了执行的代码 public static void Add(int a, int b) { Console.WriteLine(a+b); } 3、创建一个委托实例 AddDelete _adddelete = new AddDelete(Add); 创建委托实例,使用了new关键字,说明委托也是类,将方法名Add作为参数绑定到该委托实例,也就是将方法Add指派给AddDelete委托,并将该引用赋给_adddelete对象,也就表示_adddelete对象保存了指向Add方法的引用,以此实现了对Add的回调。由此可见,委托表示了对其回调方法的签名,可以将方法当做参数进行传递,并根据传入的方法来动态的改变方法调用,只要为委托提供相同的签名的方法,都可以与委托绑定。 4、调用该委托实例 _adddelete(1, 2); 完整代码如下: class Program { public delegate void AddDelete(int a,int b); static void Main(string[] args) { //创建委托实例,使用了new 关键字,说明委托也是类,将方法名Add作为参数绑定到该委托实例 AddDelete_adddelete = new AddDelete(Add);

面向对象--接口与抽象类、对象和接口(通俗讲解)

面向对象--接口与抽象类的恩恩怨怨 接口与抽象类是面向对象编程中两个非常重要的角色,二者各自起着非常重要的作用。但是很多初学的朋友往往会对使用接口还是抽象类存在的很大的迷惑。就我自己的一点心得,发表一下拙见。 面向对象的一些回顾: 面向对象世界中有一个古老的法则:接口隔离原则,指的是不要把多个功能全部都集中在一个接口里面。接口实现的功能要相对单一;衍生开来可以得到另外一个结论:对一组或者称一系列功能的实现,尽量定义相对功能单一的小模块来实现这一组功能。这其实也是解耦和的体现。 那这跟我们的接口和抽象类有什么关系呢?那又得摆出另外一个法则:依赖倒置原则,针对接口编程而不是针对实现编程。 说到这,又会有一个新的问题蹦出来,这是自相矛盾啊,既然要针对接口编程还要抽象类干吗使?我们经常说面向对象,面向对象是来源于生活的。是人们要把对现实世界中的一系列方法论应用到程序设计当中来。从对象这一概念的引入我们就可以揣摩这一点。人类社会中有很多对象的概念,人、车、物体。不幸的是用程序来实现这些对象比在概念上定义对象要难很多。 (如果能达成这一共识,您可以继续往下看,否则就请看官您移步至留言讨论吧) MS给出开发者的建议是,用抽象类来实现接口。子类再继承基类。 实例说明: 为什么要这么建议?OK,我们试着结合实际来说明一下这个问题吧。我们要造车。这个车有个基本的属性就是能移动、还必须有轮子。那我们就设计一个接口 1public interface ICar 2 { 3 string Wheel 4 { 5 get; 6 set; 7 } 8 void Move(); 9 } 10

接下来的事情,就是实现了。造什么车都行,继承一下就行。随着科技的发展,我们的车想要飞了。此时当然不能修改这个接口,因为要遵循开闭原则。为什么要遵循?我们可以想一下,人坐上飞机能飞上天。但是也没见谁认为人有会飞这个特性的。那也好办,不许修改,那我再加一个接口。 1interface IFlyable 2 { 3 void Fly(); 4 } 5 好,我们的飞行汽车最后应该是这样的。 1class FlyCar : ICar,IAerocraft 2 { 3 private string wheel = string.Empty; 4 5 public void Fly() 6 { 7 Console.WriteLine("{0}车飞起来了",this.wheel); 8 } 9 public string Engine 10 { 11 get 12 { 13 return wheel; 14 } 15 set 16 { 17 wheel = value; 18 } 19 } 20 21 public void Move() 22 { 23 Console.WriteLine("{0}轮车在走",this.wheel); 24 } 25 } 26 看起来很不错,车能飞能走了。那它现在他的祖宗到底车还是飞行器呢?我们自己在心里辩论一下吧。估计不是很容易辩清楚。 我们前面说过,面向对象的思想来源于现实生活。如果把这组例子引入到现实中来,造会飞的汽车。肯定是要在原有的汽车上面下功夫。比如你装上喷气动力装置,或者装上翅膀。

Java的对象、类、方法和接口

1.1什么叫对象?什么叫方法?什么叫面向对象的程序设计? 面向过程的程序设计语言最重要的特点是按照解决问题的一个一个步骤来设计程序。这种语言是与解决相对比较简单的问题,当程序规模较大时,将显得纷繁复杂。 “对象”原来是描述自然界时使用的一个词语。比如,现在我正在写讲义,桌上的稿纸、手中的笔、案头的参考书、身后的电脑以及窗外的鸟都可以成为对象面向对象,就是将世界看成由许多彼此之间能联络的对象组成。 不少程序设计语言借用了对象这个词语作为一个专用名词,此时,对象也是具有状态和行为两个特征。在程序设计中,对象的状态时相对处于静态的,用变量来描述和表达;而对象的行为时动态的,他们通过“方法”来实现和完成,所以方法一定是实现对象行为的语句块。从功能上讲,方法和子程序、函数很相似。变量和方法是彼此有关、相互依赖的。当然,计算机都是用数据来表示对象的状态的,也是通过对数据的操作和修改来体现某个方法的功能的。 1.2 Java作为面向对象的程序设计语言有什么特点? Java是面向对象的程序设计语言,从面向对象这个角度看,体现了如下三个特点: a:封装性—面向对象的程序设计语言都是把数据和处理数据的操作结合在一起而构成一个整体,这就是对象。对象的使用者只能看到对象的外部特性,比如,其主要功能、如何调用等,而看不到内部如何实现这些功能。作为面向对象的程序设计语言,程序中的数据就是变量,程序对数据作处理则成为方法。变量和方法都被封装在对象中。所以,一个对象就是变量和方法的集合,其中变量表明这个对象的状态,方法实现这个对象所具有的行为,而且在程序中将这些变量和方法进行封装,使它们成为一个模块,再用一个名字来代表这个模块。这样,以后得更高层的程序设计中,就不必关心某个对象的行为到底是怎样实现的。可见,将对象封装就是为了使模块尽可能少地展现其内部细节,而只是以一种界面来面向外部。 对象的封装性减少了程序各部分之间的依赖,使程序的复杂性降低,而可靠性提高,并便于修改。 b:继承性—面向对象的程序设计中,对象是从类创建出来的,这一点即将在下面的解答中说明。在Java中,许多类组成层次化结构。一个类的上一层成为父类,而下一层成为子类。一个类可以继承其父类的变量和方法,而且这种集成具有传递性。就是说,一个类可以继承其上一层和其再上一层的变量和方法。这种可传递的继承性使得下层多个相似的对象可以共享上层类的数据和程序代码,而子类又可以再继承父类的基础上增添新的内容和功能。这种代码共享和代码可增添的继承特性使Java既灵活又方便提高效率。 c:通信相关性—一个对象往往涉及多个行为。体现在程序设计中,一个对象往往包含多个方法,每一个方法对应一个行为。所以,一个对象完成某个动作也就是程序执行相应的方法。于是,就涉及对象之间通过交互来实现复杂的行为,这叫对象之间的通信。 利用通信可以实现一个对象往另一个对象的信息传递。信息传递设计三个要素:一是信息接收对象;二是接收对象中用哪个方法完成指定的动作;三是比方

内部类详解 1、定义 一个类的定义放在另一个类的内部,这个类就叫做内部类

内部类详解 1、定义 一个类的定义放在另一个类的内部,这个类就叫做内部类。 Java代码 1.public class First { 2.public class Contents{ 3. public void f(){ 4. System.out.println("In Class First's inner Class Contents method f()") ; 5. } 6.} 7. } 像这样的,Contents就叫做内部类 内部类了解外围类,并能与之通信(后面详细讲) 2、链接到外围类 创建了内部类对象时,它会与创造它的外围对象有了某种联系,于是能访问外围类的所有成员,不需任何特殊条件。 Java代码 1. public class First { 2.public class Contents{ 3. public void getStr(){ 4. System.out.println("First.str="+str); 5. } 6.} 7.private String str; 8. } 9. 在内部类Contents中,可以使用外围类First的字段str。 那么,它是如何实现的呢? 是这样的,用外围类创建内部类对象时,此内部类对象会秘密的捕获一个指向外围类的引用,于是,可以通过这个引用来访问外围类的成员。 通常,这些都是编译器来处理,我们看不到,也不用关心这个。 正是因为如此,我们创建内部类对象时,必须与外围类对象相关联。

注:嵌套类(后面会讲到)除外。 3、使用关键字.this与.new 内部类中得到当前外围类对象的引用,可以使用.this关键字,注意与new的区别 Java代码 1. private int num ; 2.public Test2(){ 3. 4.} 5. 6.public Test2(int num){ 7. this.num = num; 8.} 9. 10.private class Inner{ 11. public Test2 getTest2(){ 12. return Test2.this; 13. } 14. 15. public Test2 newTest2(){ 16. return new Test2(); 17. } 18.} 19. 20.public static void main(String [] args){ 21. Test2 test = new Test2(5); 22. Test2.Inner inner = test.new Inner(); 23. Test2 test2 = inner.getTest2(); 24. Test2 test3 = inner.newTest2(); 25. System.out.println(test2.num); 26. System.out.println(test3.num); 27.} 28. 输出结果为5 0 使用.this后,得到时创建该内部类时使用的外围类对象的引用,new则是创建了一个新的引用。 .new关键字

相关主题
文本预览
相关文档 最新文档