文档章节

多继承完美闪避成员名冲突的问题

__JM_Joy__
 __JM_Joy__
发布于 2016/06/10 01:05
字数 382
阅读 66
收藏 2
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::t

D 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:

© 著作权归作者所有

共有 人打赏支持
__JM_Joy__
粉丝 31
博文 26
码字总数 4751
作品 0
江门
程序员
私信 提问
NDK开发---C++学习(六):继承、多态

前言 前面我们已经介绍过了C++中的类与函数,不熟悉的,可以去看看 NDK开发---C++学习(三):类与函数(上) NDK开发---C++学习(四):类与函数(中) NDK开发---C++学习(五):类与函数(...

浮生若梦zp
2017/11/27
0
0
PHP简明教程-面向对象基础 2

PHP简明教程 面向对象基础 2 其他的几个魔术方法 方法名 触发时机 参数1 参数2 备注 callStatic 当调用不存在的静态方法的时候自动执行这个方法 函数名 参数(数组) 该方法必须是static slee...

栗子boomboomboom
2017/07/03
0
0
面向对象总结

面向对象思想 基本步骤:定义类--创建对象--调用方法. 类与对象 类:对事物的描述对象: 事物的实体.关系: 类就是对对象的描述. 对象就是类的具体体现. 类 : 虚的对象:实的 定义类格式: 面向对象...

scalpel-21
2016/10/24
18
0
第32节:Java中-构造函数,静态方法,继承,封装,多态,包

构造函数实例 测试类 静态方法 静态修饰的调用方式:1)类名.方法名;2)对象.方法名 继承 案例 在现实世界当中,继承就是儿子得到老子的东西,在面向对象的世界当中,继承就是一个类得到了另...

达叔小生
2018/08/21
0
0
《Java从小白到大牛》之第10章 面向对象基础(上)

《Java从小白到大牛》纸质版已经上架了!!! 面向对象是Java最重要的特性。Java是彻底的、纯粹的面向对象语言,在Java中“一切都是对象”。本章将介绍面向对象基础知识。 面向对象概述 面向...

tony关东升
2018/07/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

EMAS,一部淘宝十年移动互联网技术的演进史

导读 本文根据2018云栖大会深圳峰会·EMAS专场—移动互联的进化论,阿里巴巴高级技术专家泠茗《 EMAS全景介绍》的演讲整理而成,文中就EMAS的起源史及EMAS的五大移动研发场景解决方案进行了分...

迷你芊宝宝
33分钟前
2
0
C# 图片人脸识别

此程序基于 虹软人脸识别进行的开发 前提条件从虹软官网下载获取ArcFace引擎应用开发包,及其对应的激活码(App_id, SDK_key)将获取到的开发包导入到您的应用中 App_id与SDK_key是在初始化...

是哇兴哥棒棒哒
35分钟前
2
0
spring boot web项目连接池配置分析

两篇文档,请读者自行分析: Druid: https://www.cnblogs.com/niejunlei/p/5977895.html HikariCP: http://blog.csdn.net/clementad/article/details/46928621...

sunranhou
36分钟前
1
0
TypeError: Object of type int64 is not JSON serializable

问题 在使用json.dumps(param)将python对象转成json的过程中出现了,如下问题: TypeError: Object of type int64 is not JSON serializable 代码如下: param = { 'remoteId': 'rem......

亚林瓜子
39分钟前
1
0
Android MediaPlayer

1.通过静态方法构造 MediaPlayer.create(Context context,int resid); 2.构造方法: MediaPlayer(); 设置媒体源: setDataSource(String path); 3.设置是否循环: setLooping(boolean) 4.播放......

Coding缘
41分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部