haiconc

一种多继承方案



现在支持多继承的语言不是很多,主流的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();


posted on 2012-06-05 14:19  haiconc  阅读(1238)  评论(0)    收藏  举报

导航