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();


  • 相关阅读:
    面试题32
    面试题28. 对称的二叉树
    面试题55
    面试题04. 二维数组中的查找
    面试题58
    面试题57. 和为s的两个数字
    如果Python对于磁盘没有写入权限,还会运行吗?
    Python中的import语句
    Python决定一个变量时局部的,还是全局的,是在编译期
    Python中的Comprehensions和Generations
  • 原文地址:https://www.cnblogs.com/haiconc/p/2536622.html
Copyright © 2011-2022 走看看