zoukankan      html  css  js  c++  java
  • 一种多继承方案



    现在支持多继承的语言不是很多,主流的Java和C#都是单继承的,因为多继承有如下的缺点:
    a、结构复杂化
    b、优先顺序模糊
    c、功能冲突:不同父类中有相同的方法时会产生冲突。

    我参考了GO语言、Ruby语言等提出一个新的多继承的方案,同时也可以替代当前的比较笨重的单继承的方案。
    多继承的定义如下:
    如果一个类A含有另一个类B所有的字段,并且有B所有的抽象方法,那么A就是B的子类。
    如果子类和父类都实现相同形式的方法,那么子类作为父类运行共有的方法时会使用自己的方法。

    例子1:
        class classA
        {
             string Name;
        }

        class classB
        {
            string Name;
            string Place;
        }

        因为classB含有类classA的所有字段,所以可以认为classB是classA的子类,通过as方法可以把classB转化为classA。
        classB b = new classB();
        classA a =b.as(classA);
        如果现在有一个类
        class obj
        {
            
        }
        类obj中没有任何类成员字段,那么其它任何一个类都可以转化成obj

    例子2:
        class classA
        {
             string Name;
            void Out()
            {
                ...;
            }
        }

        class classB
        {
            string Name;
            string Place;
        }
        classA有Out方法而classB没有,这种情况下classB仍然可以转化成classA

    例子3:
        abstarct class classA
        {
             string Name;
            abstarct void Out();
        }

        
        classA有Out方法但是是抽象的放啊,这就要求能转化成它的类不但要有含有和它的相同的字段而且要有
        Out方法。
        class classB
        {
            string Name;
            string Place;
            void Out()
            {
                ...;
            }
        }
        classB实现了Out方法才能转化成classB.

    例子3:
        class classA
        {
             string Name;
            void Out()
            {
                Console.WritleLine("classA");
            }
        }

        class classB
        {
            string Name;
            string Place;
        }
        classA有Out方法而classB没有,这种情况下classB转化成classA可以调用Out方法,输出"classA".
        classB b = new classB();
        b.as(classA).Out();

    例子3:
        class classA
        {
             string Name;
            void Out()
            {
                Console.WritleLine("classA");
            }
        }

        class classB
        {
            string Name;
            string Place;
            void Out()
            {
                Console.WritleLine("classB");
            }
        }
        classA和classB都有相同的Out方法,这种情况下classB转化成classA调用的Out方法还是自己的Out方法,
        输出的是"classB"。
        classB b = new classB();
        b.as(classA).Out();


  • 相关阅读:
    KMP算法
    cocos2d-x jsbinding 在线更新策略设计
    AS3动画效果公式,常用处理公式代码,基本运动公式,三角公式
    理解引导行为:路径跟踪
    适用于任何语言的编程策略
    Using中return对象
    js计算两个时间相差天数
    fastReport 绑定DataBand数据源后还是打印出一条数据
    无法处理文件 MainForm.resx,因为它位于 Internet 或受限区域中,或者文件上具有 Web 标记。要想处理这些文件,请删除 Web 标记
    附加数据库后登陆报错
  • 原文地址:https://www.cnblogs.com/haiconc/p/2536622.html
Copyright © 2011-2022 走看看