基类BaseOutput显式继承了一个接口IOutput,之后类TrackOutput继承BaseOutput,同时又继承了IOutput接口,假定IOutput有方法Output,这样在TrackOutput中就有两个Output方法,一个源于基类BaseOutput,于个源于接口IOutput。这样就引发了混乱,要怎么办?先看下面的一段代码

    interface IOutput{void output();}
  class BaseOutput : IOutput{void IOutput.output(){Console.WriteLine("IOutput...");}   }class TrackOutput : BaseOutput, IOutput{public void Output(){Console.WriteLine("TrackOutput...");base.Output();     }}

在编译时,base.Output会报错,提示BaseOutput中不包含output的定义。这怎么会这样?BaseOutput不是继承了IOutput的方法,并实现了IOutput中的output的方法了吗?

如果把BaseOutput中对IOutput中的output显式实现,修改为隐式实现。新代码如下:

  class BaseOutput : IOutput{public void output(){Console.WriteLine("IOutput...");}   }

这样编译就可以通过,而且也可正常运行了,测试代码如下:

static void Main(string[] args){        TrackOutput t = new TrackOutput();t.Output();Console.ReadLine();}

输出正常。所以接口的显式实现在二次继承时,会出现问题。

那如果在BaseOutput中就是需要显式实现IOutput,而在TrackOutput中也需要实现Output,那怎么办?可以考虑两种方案。

方案一:

在TrackOutput中,显式转换成IOutput,然后输出。代码如下:

class BaseOutput : IOutput{void IOutput.output(){Console.WriteLine("IOutput...");}    }class TrackOutput : BaseOutput, IOutput{public void output(){Console.WriteLine("TrackOutput...");           IOutput i = this;i.output();    }}

可以看到,结果如我们所期望的输出。不过,这里有一点需要注意,在经过IOutput i=this的转换后,再i调用output方法,会调用TrackOutput的output方法,而调用output方法后,又引发里面的IOutput i=this的转换,然后循环不断,引发无限递归,从而引发问题。

为了解决这个问题,我有了方案二。

方案二:在基类BaseOutput中增加一个output的虚方法,然后在TrackOutput中重载。

代码如下:

  class BaseOutput : IOutput{void IOutput.output(){Console.WriteLine("IOutput...");} public virtual void output(){Console.WriteLine("MyOutput...");}}class TrackOutput : BaseOutput, IOutput{public void output(){Console.WriteLine("TrackOutput...");base.output();     }}

测试结果如下:

总结:.在显式继承接口时,如果需要二次继承,记得在基类中增加一个虚方法的实现。不然就使用隐式继承。

转载请注明出处:http://blog.csdn.net/xxdddail/article/details/39393489

转载于:https://www.cnblogs.com/sparkleDai/p/7604986.html

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

  1. C++的类继承与类模板

    类继承是面向对象编程中很重要(也是很难)的内容,其能有效地提高代码复用水平,提高开发的效率. 目录 基本概念 公有继承 私有继承.保护继承 包含 多重继承 类模板 基本概念 继承的种类与特点 C++中 ...

  2. mysql接口java代码_java改成接口类

    类图 1.如果开发java项目最好设置如下:----->Tools ----->Option---->Notation---->Default中的值改成Java 2.将模型转换 ...

  3. Java接口、基类、抽象类详解(图解接口、继承和实现、基类和抽象类的区别等)——Java基础系列

    文章目录 前言 总览(必看) 一.接口是"契约" 二.接口实例--Servlet接口 三.抽象标识符abstract和抽象类 四.基类作为"辅助" 求支持 前言 ...

  4. 【Java多线程】实现Runnable接口方式 / 继承Thread类方式;使用synchronized锁实现线程安全;线程安全的懒汉式单例模式;死锁问题示例

    Thread 的生命周期 一.实现Runnable接口方式 1.在 run 方法中使用 synchronized 块 /*** 例子:创建三个窗口卖票,总票数为100张.使用实现Runnable接口的 ...

  5. C++多继承中重写不同基类中相同原型的虚函数

    在C++多继承体系当中,在派生类中可以重写不同基类中的虚函数.下面就是一个例子: class CBaseA  {  public:  virtual void TestA();  };  class ...

  6. java 中普通类继承,抽象类继承,接口类继承,子类一定要重写父类中的方法吗

    一.简单总结,需要重写的有 普通类继承抽象类,重写所有抽象类方法:(不包括普通方法) 普通类继承接口,重写所有接口方法.(不包括default关键字修饰的方法) 详解见下: 普通类继承,并非一定要重写 ...

  7. c++虚继承和虚函数和抽象类、接口类,聚合类

    虚继承 虚继承用于解决多继承条件下的菱形继承问题(浪费存储空间.存在二义性). 底层实现原理与编译器相关,一般通过虚基类指针和虚基类表实现,每个虚继承的子类都有一个虚基类指针(占用一个指针的存储空间, ...

  8. C++学习 十五、类继承(1)基类,派生类,访问权限,protected

    C++学习 十五.类继承(1)基类,派生类 前言 类继承 类的关系与继承 基类, 派生类 基类 派生类 构造函数,析构函数 文件位置 访问权限 protected 后记 前言 本篇开始学习C++类的继 ...

  9. 【Java面试题】13 Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)?...

    1.什么是匿名内部类? 内部类,存在于另一个类内部的类,而匿名内部类,顾名思义,就是没有名字的内部类. 2.为什么需要匿名内部类? 每个inner class都能够各自继承某一实现类(implemen ...

最新文章

  1. javascript 的面向对象特性参考
  2. Hdu 2522 hash
  3. Linux内核开发之将驱动程序添加到内核
  4. 【DIY】可能是最简单便宜的DIY温湿度计,arduino温湿度计
  5. boost::weak_ptr相关的测试程序
  6. boost::hana::make_set用法的测试程序
  7. C++中的const成员函数(函数声明后加const,或称常量成员函数)用法详解
  8. mysql与python交互
  9. C++STL学习笔记(4) 分配器(Allocator)
  10. ACL2021最佳论文出炉,来自字节跳动
  11. 字号计算,字体大小随窗口高度变化
  12. 小偷写给失主的一封信 雷人啊!!
  13. python编辑数学函数图形_Python 绘制你想要的数学函数图形
  14. 七年布局Cloud OS,微软将再创云产业新高
  15. 手机全屏html幻灯片,Jquery+css3,实现全屏撕裂幻灯片案例教程(zepto版本的 jquery.slitslider.js)【手机版】...
  16. 手机如何查看图片分辨率?手机图片分辨率怎么修改?
  17. APP内测分发平台源码|应用分发源码|开源分发平台搭建
  18. 【C语言趣味编程100题】
  19. python剪辑视频 裁剪_用python进行视频剪辑
  20. 【CV语义分割】全卷积神经网络FCN(更新ing)

热门文章

  1. 基于卷积神经网络与迁移学习的油茶病害图像识别
  2. 通常情况下登录linux桌面环境需要,在通常情况下,登录Linux桌面环境,需要。...
  3. aes256 php,如何在PHP中进行AES256解密?
  4. CVPR 2022 论文和开源项目合集
  5. 人工智能AI、机器学习和深度学习的区别
  6. 电商渠道转化越来越低,究竟怎样引流才能提高转化率?
  7. java 大数 list_Java后台通过Collections获取list集合中最大数,最小数代码
  8. extjs计算两个DateField所间隔的月份(天数)
  9. 生物信息学 陈铭_后基因组时代生物信息学_陈铭.pdf
  10. 用python计算准确率_Pytorch 计算误判率,计算准确率,计算召回率的例子