• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

C#基础:接口(三)

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

    本文将简要介绍接口的显式实现。

    先看下面的代码:

interface IInterfaceA
{
    int GetValue(int x);
}

interface IInterfaceB
{
    int GetValue(int x);
}

class Concrete : IInterfaceA, IInterfaceB
{
    
}

    在上面的代码中,Concrete类同时实现了IInterfaceA和IInterfaceB。由于IInterfaceA和IInterfaceB有着同样的函数签名,此时如果Concrete类以实例方法来实现GetValue函数,势必会导致无论是用IInterfaceA的实例还是IInterfaceB的实例来调用GetValue函数,都会产生同样的结果。比如下面的代码会输出两个20:

interface IInterfaceA
{
    int GetValue(int x);
}

interface IInterfaceB
{
    int GetValue(int x);
}

class Concrete : IInterfaceA, IInterfaceB
{
    public int GetValue(int x)
    {
        return x + 10;
    }
}

class Program
{
    static void Main(string[] args)
    {
        IInterfaceA ia = new Concrete();
        Console.WriteLine(ia.GetValue(10));

        IInterfaceB ib = new Concrete();
        Console.WriteLine(ib.GetValue(10));
    }
}

    此时,两个接口公用了同一个函数实现。然而在更多的情况下,虽然两个接口有着相同签名的函数,但我们仍希望针对不同接口有着各自不同的函数实现。接口的显式实现就是解决这样的问题。请看下面的代码:

interface IInterfaceA
{
    int GetValue(int x);
}

interface IInterfaceB
{
    int GetValue(int x);
}

class Concrete : IInterfaceA, IInterfaceB
{
    int IInterfaceA.GetValue(int x)
    {
        return x + 10;
    }

    int IInterfaceB.GetValue(int x)
    {
        return x + 20;
    }
}

class Program
{
    static void Main(string[] args)
    {
        IInterfaceA ia = new Concrete();
        Console.WriteLine(ia.GetValue(10));

        IInterfaceB ib = new Concrete();
        Console.WriteLine(ib.GetValue(10));
    }
}

    上面的代码输出了20和30,达到了我们的要求。需要注意的是,如果直接使用Concrete类的实例,是无法调用到GetValue函数的,因为类里面没有名称为GetValue的实例函数(Instance Method)。

    从实现上看,接口的显式实现具有下面的格式:

  • 函数以<接口名>.<函数在接口中的名称>命名,例如上面的IInterfaceA.GetValue和IInterfaceB.GetValue
  • 接口的显式实现函数不能带访问修饰符(比如public,protected等)

    显式接口还有一些妙用,比如,针对未提供泛型版本的接口,为其提供类型安全机制,并能有效避免繁杂的装箱、拆箱操作。有关这方面的详细描述读者可以参考《CLR via C#》一书或其它文献资源。时间关系,我就不在这详述了。


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Multipart Form Post in C#发布时间:2022-07-13
下一篇:
C#中Trim()、TrimStart()、TrimEnd()的用法 C#中Trim()、Trim ...发布时间:2022-07-13
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap