基类显式继承接口,类继承基类时又继承同一接口,引发接口方法混乱(显式继承接口的弊端)...
基类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
基类显式继承接口,类继承基类时又继承同一接口,引发接口方法混乱(显式继承接口的弊端)...相关推荐
- C++的类继承与类模板
类继承是面向对象编程中很重要(也是很难)的内容,其能有效地提高代码复用水平,提高开发的效率. 目录 基本概念 公有继承 私有继承.保护继承 包含 多重继承 类模板 基本概念 继承的种类与特点 C++中 ...
- mysql接口java代码_java改成接口类
类图 1.如果开发java项目最好设置如下:----->Tools ----->Option---->Notation---->Default中的值改成Java 2.将模型转换 ...
- Java接口、基类、抽象类详解(图解接口、继承和实现、基类和抽象类的区别等)——Java基础系列
文章目录 前言 总览(必看) 一.接口是"契约" 二.接口实例--Servlet接口 三.抽象标识符abstract和抽象类 四.基类作为"辅助" 求支持 前言 ...
- 【Java多线程】实现Runnable接口方式 / 继承Thread类方式;使用synchronized锁实现线程安全;线程安全的懒汉式单例模式;死锁问题示例
Thread 的生命周期 一.实现Runnable接口方式 1.在 run 方法中使用 synchronized 块 /*** 例子:创建三个窗口卖票,总票数为100张.使用实现Runnable接口的 ...
- C++多继承中重写不同基类中相同原型的虚函数
在C++多继承体系当中,在派生类中可以重写不同基类中的虚函数.下面就是一个例子: class CBaseA { public: virtual void TestA(); }; class ...
- java 中普通类继承,抽象类继承,接口类继承,子类一定要重写父类中的方法吗
一.简单总结,需要重写的有 普通类继承抽象类,重写所有抽象类方法:(不包括普通方法) 普通类继承接口,重写所有接口方法.(不包括default关键字修饰的方法) 详解见下: 普通类继承,并非一定要重写 ...
- c++虚继承和虚函数和抽象类、接口类,聚合类
虚继承 虚继承用于解决多继承条件下的菱形继承问题(浪费存储空间.存在二义性). 底层实现原理与编译器相关,一般通过虚基类指针和虚基类表实现,每个虚继承的子类都有一个虚基类指针(占用一个指针的存储空间, ...
- C++学习 十五、类继承(1)基类,派生类,访问权限,protected
C++学习 十五.类继承(1)基类,派生类 前言 类继承 类的关系与继承 基类, 派生类 基类 派生类 构造函数,析构函数 文件位置 访问权限 protected 后记 前言 本篇开始学习C++类的继 ...
- 【Java面试题】13 Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)?...
1.什么是匿名内部类? 内部类,存在于另一个类内部的类,而匿名内部类,顾名思义,就是没有名字的内部类. 2.为什么需要匿名内部类? 每个inner class都能够各自继承某一实现类(implemen ...
最新文章
- javascript 的面向对象特性参考
- Hdu 2522 hash
- Linux内核开发之将驱动程序添加到内核
- 【DIY】可能是最简单便宜的DIY温湿度计,arduino温湿度计
- boost::weak_ptr相关的测试程序
- boost::hana::make_set用法的测试程序
- C++中的const成员函数(函数声明后加const,或称常量成员函数)用法详解
- mysql与python交互
- C++STL学习笔记(4) 分配器(Allocator)
- ACL2021最佳论文出炉,来自字节跳动
- 字号计算,字体大小随窗口高度变化
- 小偷写给失主的一封信 雷人啊!!
- python编辑数学函数图形_Python 绘制你想要的数学函数图形
- 七年布局Cloud OS,微软将再创云产业新高
- 手机全屏html幻灯片,Jquery+css3,实现全屏撕裂幻灯片案例教程(zepto版本的 jquery.slitslider.js)【手机版】...
- 手机如何查看图片分辨率?手机图片分辨率怎么修改?
- APP内测分发平台源码|应用分发源码|开源分发平台搭建
- 【C语言趣味编程100题】
- python剪辑视频 裁剪_用python进行视频剪辑
- 【CV语义分割】全卷积神经网络FCN(更新ing)
热门文章
- 基于卷积神经网络与迁移学习的油茶病害图像识别
- 通常情况下登录linux桌面环境需要,在通常情况下,登录Linux桌面环境,需要。...
- aes256 php,如何在PHP中进行AES256解密?
- CVPR 2022 论文和开源项目合集
- 人工智能AI、机器学习和深度学习的区别
- 电商渠道转化越来越低,究竟怎样引流才能提高转化率?
- java 大数 list_Java后台通过Collections获取list集合中最大数,最小数代码
- extjs计算两个DateField所间隔的月份(天数)
- 生物信息学 陈铭_后基因组时代生物信息学_陈铭.pdf
- 用python计算准确率_Pytorch 计算误判率,计算准确率,计算召回率的例子