龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > web编程 > asp.net编程 >

C#实现隐式接口和显式接口讲解

时间:2009-12-21 11:47来源:未知 作者:admin 点击:
分享到:
C#中对于接口的实现方式有隐式接口和显式接口两种,本文讨论了隐式接口和显式接口的一些区别,并延伸了语言设计层面背后的一些个人体会。 隐式实现和显示实现的例子 隐式地实现

C#中对于接口的实现方式有隐式接口和显式接口两种,本文讨论了隐式接口和显式接口的一些区别,并延伸了语言设计层面背后的一些个人体会。
隐式实现和显示实现的例子
隐式地实现接口成员
创建一个接口,Chinese,包含一个成员 Speak;我们创建一个类Speaker,实现接口Chinese
//隐藏式实现例子
public interface Chinese
{
    string Speak();
}

public class Speaker : Chinese
{
    public string Speak()
    {
        return "中文";
    }
}

这个就是隐式实现
显式地实现接口成员 -- 创建一个仅通过该接口调用并且特定于该接口的类成员。这是使用接口名称和一个句点命名该类成员来实现的。
创建一个接口,English,包含一个成员 Speak;让我们的类Speaker来实现接口English

//显式实现例子
public interface English
{
    string Speak();
}

public class Speaker : English
{
     string English.Speak()
    {
        return "English";
    }
}

  隐式实现和显示实现的区别
1.      语法层面的区别
l          隐式方式Speaker的成员(Speak)实现有而且必须有自己的访问修饰符(public),显示实现方式Speaker的成员(Speak)不能有任何的访问修饰符。
l          显示实现方式Speaker使用接口名称和一个句点命名该类成员(Speak)来实现的:English.Speak()
2.      Client的使用者层面
隐式实现的客户端调用,注意类的声明,可以用接口声明,也可以用实现类 Speaker声明。调用者都可以得到调用实例化对象的行为Speak;
class Program
{
    static void Main(string[] args)
    {
        Chinese c = new Speaker();
        c.Speak();

        Speaker s = new Speaker();
        s.Speak();
    }
}  显式实现的客户端调用,注意类的声明,只可以用接口声明,调用者才可以可以得到调用实例化对象的行为Speak;   

Code
class Program
    {
        static void Main(string[] args)
        {
            English c = new Speaker();
            c.Speak();
            //下面写法将引起编译错误错误“PetShop.Speaker”不包含“Speak”的定义
           // Speaker s = new Speaker();
           // s.Speak();
        }
    }

隐示实现对象声明为接口和类都可以访问到其行为, 显示实现只有声明为接口可以访问。
选择隐式实现还是显示实现
隐式和显式接口实现的关键区别显然并不在于方法声明,而是在于从类外部的可访问性。以下是一些基本的设计原则,可以利用它们来帮助自己选择显式还是隐式实现。
1. 业务语义的考虑?
  考虑接口Chinese和English对于成员的Speak的业务需求,Speaker要实现这两个接口,如果采用隐式实现,语法没有问题,业务满足了吗?
例如:
Code
//服务端:
public class Speaker : English, Chinese
{
    public  string Speak()
    {
        return "English";
    }
}

//调用端:
class Program
{
    static void Main(string[] args)
    {
        Chinese c = new Speaker();
        c.Speak();
    }
}

呵呵,这完全可以编译通过,但是放在实际的业务场景去考虑,这不是很幽默吗?


收藏文章
表情删除后不可恢复,是否删除
取消
确定
图片正在上传,请稍后...
评论内容为空!
还没有评论,快来抢沙发吧!

热评话题

按钮 内容不能为空!
立刻说两句吧! 查看0条评论
精彩图集

赞助商链接