C#学习笔记:接口

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来修饰,否则报错。

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

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

你可能感兴趣的:(C#学习笔记:接口)