A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘煜 中级黑马   /  2012-7-16 00:07  /  2448 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

C#中接口的显示实现和隐式实现有什么区别啊?

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

5 个回复

倒序浏览
继承接口有两种实现方式:
A:显示实现接口,B:(隐式)实现接口
interface IAnimal  {
          string Add(string name);
          string Delete(string name);  
  }



class Dog:IAnimal
    {
        #region IAnimal 成员  
        //隐式实现接口
        public string Add(string name)
        {
            throw new Exception("The method or operation is not implemented.");
        }

        public string Delete(string name)
        {
            throw new Exception("The method or operation is not implemented.");
        }

        #endregion

        #region IAnimal 成员
        //显示实现接口
        string IAnimal.Add(string name)
        {
            throw new Exception("The method or operation is not implemented.");
        }

        string IAnimal.Delete(string name)
        {
            throw new Exception("The method or operation is not implemented.");
        }

        #endregion
    }

B:(隐式)实现接口
string name="aa";
            Dog dy = new Dog();//隐式
            dy.Add(name);
A:显示实现接口           
Dog d = new Dog();//显示实现接口后调用方法
                  //需要进行类型转换
            ((IAnimal)d).Add(name);

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
隐示实现对象声明为接口和类都可以访问到其行为,显示实现只有声明为接口可以访问。

如果两个接口中有相同的方法名,那么同时实现这两个接口的类,就会出现不确定的情形,在编写方法时,也不知道实现哪个接口的方法了。为解决这一问题,C#提供了显示接口实现技术,就是在方法名前加接口名称,用接口名称来限定成员。用“接口名.方法名()”来区分实现的是哪一个接口。

注意:显示接口实现时,在方法名前不能加任何访问修饰符。这种方式和普通方法不同,普通方法前不加访问修饰符,默认为私有的,而显式接口实现时方法前不加任何修饰符,默认为公有的,如果前面加上修饰符,会出现编译错误。

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
隐示实现接口和类都可以访问

显示实现只有接口可以访问。

举例:
public interface IReview
{
    void GetReviews();
}
public class ShopReview :IReview
{
    public void GetReviews(){}
}

这种方式是隐示实现:

IReview rv = new ShopReview();rv.GetReviews();

ShopReview rv = new ShopReview();rv.GetReviews();

都可以调用GetReviews这个方法。

还有一种方式是显示实现:

public interface IReview
{
    void GetReviews();
}
public class ShopReview :IReview
{
    void IReview.GetReviews(){}
}

通过这种方式的接口实现。GetReviews就只能通过接口来调用:

IReview rv = new ShopReview();rv.GetReviews();

下面的这种方式将会编译错误:

ShopReview rv = new ShopReview();rv.GetReviews();

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
隐式实现的话实现的方法属于实现的类的,可以直接通过类的对象访问。
显式实现的话方法是属于接口的,可以看成是寄托在类中实现的,访问这些方法时要先把对象转换成接口对象,然后通过接口对象调用。
回复 使用道具 举报
1,如果类或者结构要实现的是单个接口,可以使用隐式实现;
2,如果类或者结构继承了多个接口那么接口中相同名称成员就要显式实现。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马