深入浅出C(中文版图文皆译)第七章.doc
文本预览下载声明
Head First C# 中文版 第七章
连载地址:/cuipengfei1
SWPU崔鹏飞翻译,欢迎指出其中的错误、不妥。
(下载源码就到源码网:)(下载源码就到源码网:)
(下载源码就到源码网:)
实现接口的类必须要包含接口定义的所有方法
实现接口也就意味着类要实现接口中定义的每一个方法、属性,否则无法编译。如果一个类实现不止一个接口,那就要在该类中写所有接口定义的每一个方法、属性。但是,不要轻易相信我们给你的结论,如下做:
①创建一个新应用并添加一个叫做IStingPatrol.cs的类文件
不要向该文件写入一个类,把上一页的IStingPatrol接口键入。
②向项目添加一个Bee类
暂时不要写方法、属性进去。只是让它实现IStingPatrol接口:
public class Bee : IStingPatrol {
③编译
试着编译一下。啊!编译器报错了:
④向Bee类添加属性、方法
添加一个LookForEnemies方法和一个SharpenStinger方法--这两个方法不需要做什么。然后添加一个叫做AlertLevel的int属性的get访问器还有一个叫做StingerLength的int属性的set访问器。现在程序可以编译了!
做一点接口的练习
接口很容易使用,但是理解它的最好方式就是亲自用一下。创建一个新传统应用,拖拽一个按钮进去,开始吧!
①下面是TallGuy类,按钮的事件响应方法初始化TallGuy对象,并调用其TalkAboutYourself()方法。这儿没什么不懂的--我们一会会用到它:
②创建一个IClown接口。你已经知道了接口中的成员都是公有的。但是不要轻易相信我们告诉你的。如下声明一个接口:
public interface IClown
然后试着在其中声明一个私有方法:
private void Honk();
编译它,你将会看到如下的IDE报出的错误:
现在删除private访问修饰符--错误将会消失,程序可以编译了。
③翻页之前,试着看看你可不可以完成IClown接口,并让TallGuy类实现它。IClown接口要有一个无参的返回值为void的方法,叫做Honk,还有一个只读的strig属性,叫做FunnyThingIHave,它只有get访问器没有set访问器。
④接口写出来是下面这样的--做对了吗?
现在让TallGuy类实现IClown接口。记住冒号后面首先写需要继承的类,然后才是接口,以逗号隔开。因为TallGuy不继承其它类,只实现一个接口,所以声明语句如下:
暂时不要对TallGuy类做别的修改,编译一下,你会看到下面的报错:
⑤把接口中定义的方法、属性写进类里面去,错误就会消失了。来实现接口吧。添加一个只读的string类型的属性,叫做FunnyThingIHave,它的get访问器总是返回“big shoes”。然后添加一个Honk()方法,它弹出一个写着“Honk honk”的消息框。
⑥现在你的代码可以编译了!修改你的按钮的事件响应方法,让对象初始化器设置FunnyThingIHave属性,并调用对象的Honk()方法。
不可以实例化一个接口,但是可以创建它的引用
假设有一个接口定义一个FindFlower()方法,它要求对象有该方法。任何实现了INectarCollector接口的对象都可以。可以是Worker对象,Robot对象,甚至Dog对象也可以。
接口引用就是做这个用的。你可以用接口的引用指向实现了该接口的类的实例,你可以确保指向的对象一定包含会有你想要的方法--即使你并不怎么了解这个对象。
很显然,你不可以用new关键字来实例化接口,因为其中并没有方法、属性的实现体。如果可以实例化一个接口的话,那创建出来的对象怎么可能知道自己应该如何行为呢?
第一行是一个普通的new语句,创建一个叫做Fred的引用并把它指向一个NectarStinger对象。
第二行很有趣。它创建了一个IStingPatrol接口类型的引用变量。初看起来有点奇怪。但是看看下面:
NectarStinger ginger = fred;
上面这行代码你肯定懂--它创建一个叫做ginger的NectarStinger的引用并把它指向fred指向的对象。声明george的那一行也是一样。
到底是怎么样呢?
只有一个new语句,所以只有一个新对象被创建出来。第二个语句创建一个叫做george的引用变量,它可以指向任何实现了IStingPatrol的类的实例。
接口引用和对象引用基本一样
你已经知道对象在托管堆上的存在形式了。而接口引用只是指向对象的另一种方式而已。看--很简单!
①创建几个蜜蜂对象
这种语句我们已经很熟悉了。
②添加IStingPatrol和INectarCollect
显示全部