类继承多个接口有相同的方法时,怎么办?(接口显式实现的作用)

在《接口的显式实现与隐式实现》中讲到了接口的显式实现,那有什么作用呢?我们来看一段代码。

 class Program
    {
        static void Main(string[] args)
        {
            SimpleOutput s = new SimpleOutput();
            IOutput io = s;
            ILog il = s;
            s.output();
            io.output();
            il.output();
            Console.ReadLine();
        }
    }

    interface IOutput
    {
        void output();
    }

    interface ILog
    {
        void output();
    }

    class SimpleOutput : IOutput, ILog
    {
        public void output()
        {
            Console.WriteLine("SimpleOutput .....");
        }

        void IOutput.output()
        {
            Console.WriteLine("IOutput...");
        }

        void ILog.output()
        {
            Console.WriteLine("ILog...");
        }
    }

看一下这段代码的输出结果:

从结果中可以看到,虽然都是源于SimpleOutput,但是输出了三个不同的结果。原因何在?

在接口IOutput和ILog中,都有output方法,在SimpleOutput继承IOutput和ILog时,需要对两个接口的output方法进行实现。由于方法名相同,不可采用隐式实现,所以采用IOutput.output()和ILog.output()的显式实现。

这样在IOutput io = s时,虽然io源于s的实例,但是输出的却是IOutput.output方法。同样的,ILog il = s虽然源于s的实例,但是输出的却是ILog.output方法。而s输出的是SimpleOutput的output方法。

因此,导致了三种不同的结果。

时间: 2024-08-25 00:24:11

类继承多个接口有相同的方法时,怎么办?(接口显式实现的作用)的相关文章

接口、接口优点、接口的属性和方法特性、接口与继承的区别、接口与抽象类的区别、匿名实现类、JDK1.8新特性、打印类名称

接口里的属性,必须是公共的/默认的&静态的&Final&初始化后的属性: 接口里所有方法都是抽象的. 接口和继承---先天有的用继承,后天学习的用接口: 接口特性-------- 1.接口不可以被实例化: 2.实现类必须实现接口中所有方法,否则实现类必须是抽象类 3.实现类可以实现多个接口,来弥补Java不能多继承: 4.接口中的变量都是静态常量:(静态的-可以通过类的名字点-直接调用:) ----------------------------------------------

PHP类继承、接口继承关系概述

PHP类继承: PHP类不支持多继承,也就是子类只能继承一个父类,但是支持多层次继承,比如: 1 class frist{ 2 public function __construct(){ 3 echo "我是第一个类.","<br>"; 4 } 5 public function printer(){ 6 echo "frist","<br>"; 7 } 8 } 9 class seconds ext

JDK8.0接口中的默认方法和静态方法

我们在接口中通常定义的方法是抽象方法,即没有方法体,只有返回值类型和方法名:(public abstract) void Method(); 类在实现接口的时候必须重写抽象方法才可以 jdk8中新加的默认方法和静态方法是什么呢? 可以通俗理解:静态方法属于类,调用静态方法通过接口名曲调用它,默认方法在实现类中可以重写,可以不重写 ;默认方法,在接口中定义,区别抽象方法,有方法体 public interface DefaultStaticInterface { //普通方法,类实现接口必须重写它

实现接口与显式实现接口的区别

原文:http://www.cnblogs.com/chenxizhang/archive/2008/08/22/1274265.html 在实现接口的时候,VS提供了两个菜单,一个是"实现接口",一个是"显式实现接口",它们到底有何不一样呢 我们来比较一下看看 1.首先假设我们有一个接口 public interface ICustomer{    void SomeMethod();} 2.如果是"实现接口",那么代码大致如下 public

008.在C#中,显式接口VS隐式接口

原文http://www.codeproject.com/Articles/1000374/Explicit-Interface-VS-Implicit-Interface-in-Csharp (Aty表示本人) 介绍 什么是显式和隐式接口 什么时候需要显式接口 更简洁的方法(ISP:接口隔离原则) 显式接口更多 结论 介绍 文章将讨论下显式接口,讨论它们与隐式接口的区别,以及为什么应该避免使用. 什么是显式和隐式接口 C#中有两种方式来实现接口:显式和隐式 定义如下接口: 当我们隐式的实现该接

基类显式继承接口,类继承基类时又继承同一接口,引发接口方法混乱(显式继承接口的弊端)

基类BaseOutput显式继承了一个接口IOutput,之后类TrackOutput继承BaseOutput,同一时候又继承了IOutput接口.假定IOutput有方法Output,这样在TrackOutput中就有两个Output方法,一个源于基类BaseOutput,于个源于接口IOutput.这样就引发了混乱.要怎么办?先看以下的一段代码 interface IOutput { void output(); } class BaseOutput : IOutput { void IOu

黑马程序员---java基础-Java类 继承&amp;抽象&amp;接口

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一.继承 继承是所有OOP语言不可缺少的部分,在java中使用extends关键字来表示继承关系.当创建一个类时,总是在继承,如果没有明确指出要继承的类,就总是隐式地从根类Object进行继承.比如下面这段代码: 1 class Person { 2 public Person() { 3 4 } 5 } 6 class Man extends Person { 7 public Man()

人类家族类(类继承与接口实现)===API

祖先类Animal.java public class Animal{ public void eat(){ System.out.println("动物需要吃东西"); } public void drink(){ System.out.println("动物需要喝水"); } public void needsleep(){ System.out.println("动物需要睡觉"); } } 第二祖先类继承祖先类Human .java pub

类继承接口、使用接口实例化 与 使用类实例化

一. 接口不能实例化,用接口的实现类可以实例化,将实现类的对象在内存中的地址指向接口,这个接口就可以使用了 二. 实现接口的类 实例 = new 实现接口的类()// 这样用不好吗? //这样已经不是好不好的问题了,这样的话,要接口有什么用? //用接口就是让实例和实现类的耦合度降低. //让程序更加容扩展. 以下是问题之外的知识,想看可以往下,不想看跳过. 接口 实例 = new 实现接口的类A() 接口 实例 = new 实现接口的类B() 接口 实例 = new 实现接口的类C() 这样的