为什么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

多继承完美闪避成员名冲突的问题相关推荐

  1. c++中的继承--2(继承中的析构函数和构造函数,继承中同名成员,继承中静态成员)

    继承中的构造函数和析构函数 继承中的构造和析构顺序 子类创建对象时,先调用父类的构造,然后调用自身构造 析构顺序与构造顺序相反 子类不会继承父类的构造函数和析构函数 如果父类中没有合适默认构造,那么子 ...

  2. CS0533隐藏继承的抽条成员/CS0534不实现继承的抽象成员

    vs提示的错误信息 CS0533 "KeepLiveService.OnBind(Intent)"隐藏继承的抽象成员"Service.OnBind(Intent2)&qu ...

  3. 【Groovy】Groovy 方法调用 ( 使用 对象名.@成员名 访问 Groovy 对象成员 )

    文章目录 一.使用 对象名.@成员名 访问 Groovy 对象成员 二.完整代码示例 一.使用 对象名.@成员名 访问 Groovy 对象成员 针对 Groovy 中的类 , class Studen ...

  4. 【Groovy】Groovy 方法调用 ( 使用 对象名.成员名 访问 Groovy 类的成员 | 使用 对象名.‘成员名‘ 访问类的成员 | 使用 对象名[‘成员名‘] 访问类成员 )

    文章目录 一.使用 对象名.成员名 访问 Groovy 类的成员 二.使用 对象名.'成员名' 访问 Groovy 类的成员 三.使用 对象名['成员名'] 访问 Groovy 类的成员 四.完整代码 ...

  5. /bin/tar: 从成员名中删除开头的“/”

    From: http://www.361way.com/tar-error/1550.html 今天在使用tar进行打包时,发现报了'从成员名中删除开头的"/"'的错误.我使用的打 ...

  6. Java笔记-通过放射获取类中成员名及调用get方法及map构造JSON数据

    目录 通过反射获取类中成员名 通过反射调用get方法 map生成JSON数据 通过反射获取类中成员名 /*** 获取类中的所有成员名* @param currentClass* @return* @t ...

  7. C++ 单继承访问私有成员

    c++ 单继承之如何调用私有成员 #include <iostream> #include <string> using namespace std; class Person ...

  8. 私有继承与保护继承(protected 成员)

    私有继承(private): 继承的访问控制: 基类的public和protected成员:都以private身份出现在派生类中 基类的private成员:不可直接访问 访问权限: 派生类中的成员函数 ...

  9. c++ 继承的同名成员以及同名函数的处理方式

    #include<iostream> using namespace std; #include<string> //1.继承中同名成员的处理方式  class Base{   ...

  10. android studio 导入模块SDK 以及该模块中继承application的类与原工程继承application的类存在冲突 解决方法

    android studio 导入模块SDK 以及该模块中继承application的类与原工程继承application的类存在冲突 解决方法 导入某修改后的海康视频SDK(老师给的),并修改相关文 ...

最新文章

  1. 知乎自动批量软件使用教程
  2. 软件测试技术与项目实训pdf,软件测试技术任务驱动式教程pdf
  3. python 标签云_标签云算法Python实现
  4. 程序的装入和链接过程
  5. 博弈树α-β剪枝搜索学习参考资料
  6. python中的cv2模块能否保存图像的地理坐标信息_Python中plt.plot图像保存有白边,CV2.polyline,fillpoly的参数问题,图像保存颜色发生异常...
  7. Python 多线程-共享全局变量问题 -args参数 同步的概念
  8. ubuntu类似sourcetree的git可视化工具安装
  9. 斗鱼直播间弹幕爬取2020年最新python
  10. hibernate历史版本下载
  11. 计算机基础与程序设计
  12. 历史上最伟大的12位程序员
  13. 在线键盘按键检测工具
  14. 台式计算机怎么安装无线网卡,台式机无线网卡怎么用 台式机USB无线网卡安装使用教程...
  15. Migration中的Collation Confliction
  16. IOS开发之——硬件开发-距离传感器(02)
  17. 找到所有数组中消失的数字_【一点资讯】千万程序员的呼声:面试如何拿到大厂Offer?这份阅读量超过11W+的算法刷题宝典请你原地查收 www.yidianzixun.com...
  18. 【重识前端】闭包与模块
  19. 【转】可以让你迅速发财的23种盖世奇功
  20. 走进web(关于web、web1.0、web2.0、web3.0)

热门文章

  1. python自定义函数的参数调用_python | 自定义函数
  2. python基础判断题汇总_python基础 判断题
  3. Python中的jquery PyQuery库使用小结
  4. 不同加密算法的国际标准与国标
  5. MAC编译jogl/gluegen很顺利
  6. 六石管理学:考评不要与自己为难
  7. 2021-11-09
  8. C加载JVM崩溃,一般是因为某个变量为NULL
  9. Linux的互斥锁、条件锁的用法
  10. DeepStream不支持多 RTSP源(多个摄像头)