多继承完美闪避成员名冲突的问题
为什么80%的码农都做不了架构师?>>>
class A {fn t() {"A::t"}
}class B {fn t() {"B::t"}
}class C {extends A {fn t() {"(C override A)::t"}}extends B {}fn t() {"C::t"}
}class D {extends B {}extends C {fn t() {parent.t()(parent as A).t()(parent as B).t()"(D override C)::t"}}fn t() {"D::t"}
}C c = new c()
c.t() // C::t
(c as A).t() // (C override A)::t
(c as B).t() // B::tD d = new D()
d.t() // D::t
(d as A).t() // (C override A)::t
(d as B).t() // B::t
(d as C).t() // C::t// (C override A)::t// B::t// (D override C)::t
这里的as其实是类型声明或强制类型转换。
对于类继承的所有父类,都有一个独立的域。
对象通过对不同的声明类型使用不同的方法,到达多态的效果,即使类中有多个重名方法也不受影响。
但是要为了解决菱形继承的问题:
class A {fn t() {"A::t"}
}class B {fn t() {"B::t"}
}class C {extends A {fn t() {"(C override A)::t"}}extends B {fn t() {"(C override B)::t"}}
}class D {extends A {}extends B {}
}fn c_a_t(c: C(A)) {c.t()
}fn c_b_t(c: C(B)) {c.t()
}// fn c_t(c: C) {
// c.t() // 编译错误!不知道使用哪一个t()
// }D d = new D()
(d as A).t() // A::t
(d as B).t() // B::t
// d.t() // 编译错误!不知道使用哪一个t()
// (d as C).t() // 编译错误!不知道使用哪一个t()// 但是如果确实要将d多态为D,就要明确要使用的类
(d as C(A)).t() // (C override A)::t
c_a_t.t() // (C override A)::t
(d as C(B)).t() // (C override B)::t
c_b_t.t() // (C override B)::t
:smirk:
转载于:https://my.oschina.net/jmjoy/blog/689288
多继承完美闪避成员名冲突的问题相关推荐
- c++中的继承--2(继承中的析构函数和构造函数,继承中同名成员,继承中静态成员)
继承中的构造函数和析构函数 继承中的构造和析构顺序 子类创建对象时,先调用父类的构造,然后调用自身构造 析构顺序与构造顺序相反 子类不会继承父类的构造函数和析构函数 如果父类中没有合适默认构造,那么子 ...
- CS0533隐藏继承的抽条成员/CS0534不实现继承的抽象成员
vs提示的错误信息 CS0533 "KeepLiveService.OnBind(Intent)"隐藏继承的抽象成员"Service.OnBind(Intent2)&qu ...
- 【Groovy】Groovy 方法调用 ( 使用 对象名.@成员名 访问 Groovy 对象成员 )
文章目录 一.使用 对象名.@成员名 访问 Groovy 对象成员 二.完整代码示例 一.使用 对象名.@成员名 访问 Groovy 对象成员 针对 Groovy 中的类 , class Studen ...
- 【Groovy】Groovy 方法调用 ( 使用 对象名.成员名 访问 Groovy 类的成员 | 使用 对象名.‘成员名‘ 访问类的成员 | 使用 对象名[‘成员名‘] 访问类成员 )
文章目录 一.使用 对象名.成员名 访问 Groovy 类的成员 二.使用 对象名.'成员名' 访问 Groovy 类的成员 三.使用 对象名['成员名'] 访问 Groovy 类的成员 四.完整代码 ...
- /bin/tar: 从成员名中删除开头的“/”
From: http://www.361way.com/tar-error/1550.html 今天在使用tar进行打包时,发现报了'从成员名中删除开头的"/"'的错误.我使用的打 ...
- Java笔记-通过放射获取类中成员名及调用get方法及map构造JSON数据
目录 通过反射获取类中成员名 通过反射调用get方法 map生成JSON数据 通过反射获取类中成员名 /*** 获取类中的所有成员名* @param currentClass* @return* @t ...
- C++ 单继承访问私有成员
c++ 单继承之如何调用私有成员 #include <iostream> #include <string> using namespace std; class Person ...
- 私有继承与保护继承(protected 成员)
私有继承(private): 继承的访问控制: 基类的public和protected成员:都以private身份出现在派生类中 基类的private成员:不可直接访问 访问权限: 派生类中的成员函数 ...
- c++ 继承的同名成员以及同名函数的处理方式
#include<iostream> using namespace std; #include<string> //1.继承中同名成员的处理方式 class Base{ ...
- android studio 导入模块SDK 以及该模块中继承application的类与原工程继承application的类存在冲突 解决方法
android studio 导入模块SDK 以及该模块中继承application的类与原工程继承application的类存在冲突 解决方法 导入某修改后的海康视频SDK(老师给的),并修改相关文 ...
最新文章
- 知乎自动批量软件使用教程
- 软件测试技术与项目实训pdf,软件测试技术任务驱动式教程pdf
- python 标签云_标签云算法Python实现
- 程序的装入和链接过程
- 博弈树α-β剪枝搜索学习参考资料
- python中的cv2模块能否保存图像的地理坐标信息_Python中plt.plot图像保存有白边,CV2.polyline,fillpoly的参数问题,图像保存颜色发生异常...
- Python 多线程-共享全局变量问题 -args参数 同步的概念
- ubuntu类似sourcetree的git可视化工具安装
- 斗鱼直播间弹幕爬取2020年最新python
- hibernate历史版本下载
- 计算机基础与程序设计
- 历史上最伟大的12位程序员
- 在线键盘按键检测工具
- 台式计算机怎么安装无线网卡,台式机无线网卡怎么用 台式机USB无线网卡安装使用教程...
- Migration中的Collation Confliction
- IOS开发之——硬件开发-距离传感器(02)
- 找到所有数组中消失的数字_【一点资讯】千万程序员的呼声:面试如何拿到大厂Offer?这份阅读量超过11W+的算法刷题宝典请你原地查收 www.yidianzixun.com...
- 【重识前端】闭包与模块
- 【转】可以让你迅速发财的23种盖世奇功
- 走进web(关于web、web1.0、web2.0、web3.0)