【c# 学习笔记】显示接口实现方法

  在接口  一张中,使用了隐式的接口实现方式,即在实现代码中没有制定实现那个接口中的CompareTo方法。相应地,自然就有显式的

接口实现方式,它指的是在实现过程中,明确指出实现哪一个接口中的哪一个方法。

  当多个接口中包含相同方法名称、相同返回类型和相同参数时,如果一个类同时实现了这些接口,隐式的接口实现就会出现命名冲突的

问题。如下演示:

  

    interface IChineseGreeting
    {
        void SayHello();

    }

    interface IAmericanGreeting
    {
        void SayHello();
    }

    public class Speaker:IChineseGreeting,IAmericanGreeting
    {
        public void SayHello()
        {
            Console.WriteLine("你好");
        }
    }

        static void Main(string[] args)
        {

            Speaker speaker = new Speaker();

            //调用中国人打招呼方法
            IChineseGreeting iChineseG = (IChineseGreeting)speaker;
            iChineseG.SayHello();

            //调用美国人的打招呼方法
            IAmericanGreeting iAmericanG = (IAmericanGreeting)speaker;
            iAmericanG.SayHello();

            Console.Read();
        }

  以上代码定义了一个Speaker类,它实现了两个接口,并且这两个接口声明的方法具有相同的

返回类型、相同的方法名称和相同的参数(演示都无参数)。若采用隐式的接口实现方式,将调用相同的SayHello()方法,而不管是获取了那个接口。

  

   从运行结果可以发现,不管获得了那个接口,程序都是调用的同一个方法实现,即都输出“你好”。但我们期望的并不是这样,我们希望调用IAmericanGreeting

接口的Sayhello()时能够输出的是“Hello”,而调用IChineseGreeting接口的SayHello方法时才输出“你好”。

     显示的接口实现方式可以解决这样的命名冲突问题,如下:

  

    public class Speaker:IChineseGreeting,IAmericanGreeting
    {
         void IChineseGreeting.SayHello()
        {
            Console.WriteLine("你好");
        }
         void IAmericanGreeting.SayHello()
        {
            Console.WriteLine("Hello");
        }


    }



  运行结果如下: 

 

  在使用显式的接口实现方式时,需要注意以下几个问题。

    1.若使用显式实现接口,方法不能使用任何访问修饰符,显式实现的成员都默认为私有。如下:

    

    2.显式实现的成员默认是私有的,所以这些成员都不能通过类的对象进行访问。

    

  分析了隐式接口与显式接口的实现方式,如下几点是对其使用场景总结:

    1.采用隐式接口实现时,类和接口都可以访问接口中的方法;而若采用显式接口实现方式,接口方法只能通过接口来完成访问,因为此时接口方法默认为私有。

    2.当类实现单个接口时,通常使用隐式接口实现方法,这样类的对象可以直接去访问接口方法。

    3.当类实现了多个接口,并且接口中包含相同的方法名称、参数和返回类型时,则应使用显式接口实现方式。即使没有使用相同的方法前面,在实现多个接口时,仍推荐使用显式的方式,因为这样可以标识出哪个方法属于哪个接口。

  

猜你喜欢

转载自www.cnblogs.com/xiaoyehack/p/9231880.html