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