开发是一门技术,编程是一种艺术

游戏老手,编程新手
随笔 - 11, 文章 - 0, 评论 - 58, 引用 - 0
数据加载中……

C#学习笔记:接口

假如在实现多个接口时,接口中包含有相同和函数,必须要显式地实现各个函数(有一个可以隐式实现),而且在以后调用的时候也必须通过接口调用。说不太清,还是看代码吧:

假如有两个接口IReadalbe和IStorable,都含有Read();

interface IStorable
    {
        void Read( );
    }

interface IReadable
    {
        int Read();
    }

然后,我们有个类使用这两个接口:

class Test : IStorable, IReadable
{
    public int Read()
    {
        Console.WriteLine("Which one?");
        return 1;
    }

    //void IStorable.Read()
    //{
    //    Console.WriteLine("IStorable?");
    //}

}

假如不取消注释,那么代码无法通过编译(没有实现全部接口)。取消注释后,int Read()表示为实现IReadable接口。写代码测试:

Test t = new Test();
t.Read(); //输出为 Which one?
IStorable a = t;
a.Read(); //输出为 IStorable
IReadable b = t;
b.Read(); //输出为 Which one?

看起来似乎没有什么问题,假如我们再显示地实现IReadable的Read(),即在Test类里面再添加如下代码:

int IReadable.Read()
{
    Console.WriteLine("IReadable");
    return 1;
}

再测试:

Test t = new Test();
t.Read(); //输出为 Which one?
IStorable a = t;
a.Read(); //输出为 IStorable
IReadable b = t;
b.Read(); //输出为 IReadable

这里看起来我们的确能够通过接口调用我们实现的函数,但是此时的t.Read()就不知道该算什么了。它似乎不是任何一个接口的实现,而且我们可以随意更改它的返回类型,看起来似乎它又成了一个独立函数?在第一次测试中,IReadable认为它是其实现并调用,可是在第二次测试中,IReadable发现了自己的专门实现后就不在调用它了。结果这个Read()就成了不是任何接口的实现,但它却和接口提供的函数同名! 或者说Test类的Read()实现了3个接口?

如果两个接口都是提供void Read(),那么我们只要实现在Test类里实现void Read()就可以算是同时实现了两个接口,不过我们仍然可以显式地为两个接口提供不同的实现函数,那样的话,我们仍然可以再存在一个与接口无关的同名函数。

 此外,对于IReadable.Read()和IStorable.Read()都不能用pubic这类modifiers来修饰,否则报错。

虽然看起来是很奇怪的一种实现,而且也找不到什么实际的意义,不过既然发现了这个现象,先在此做个记录,说不定以后有新发现。

也希望有实际经验的人说说实际项目中会不会有这种情况。

posted on 2008-06-12 21:59 54sun 阅读(1885) 评论(3)  编辑 收藏 引用 所属分类: C#

评论

# re: C#学习笔记:接口  回复  更多评论   

一开始写了IStorable.Read之后,Read就变成了IReadable得了。这个方法似乎是让你控制直接在类调用Read的时候究竟是调用哪个Read。没有考证。
2008-06-13 02:03 | 陈梓瀚(vczh)

# re: C#学习笔记:接口  回复  更多评论   

不好意思,我调试的时候似乎和你的不一样

interface IStorable
{
void Read( );
}

interface IReadable
{
int Read();
}

然后,我们有个类使用这两个接口:

class Test : IStorable, IReadable
{
public int Read()
{
Console.WriteLine("Which one?");
return 1;
}

void IStorable.Read()
{
Console.WriteLine("IStorable?");
}

}


使用此段代码运行后
Test t = new Test();
t.Read();
IStorable a = t;
a.Read(); //输出为 Which one?
这个是我调试的结果,请指教下。。。。
2008-07-24 06:24 | question

# re: C#学习笔记:接口  回复  更多评论   

回ls:
我重新测试了一遍,测试结果是:
Which one?
Storable?
Which one?

你是不是看错了?发上源码来看看。
2008-08-01 14:29 | 54sun

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理