日期:2014-05-20  浏览次数:20798 次

为什么C#舍弃了C++中的多继承而支持单一继承与多接口继承呢?
个人学习C#的疑惑,想不明白,是出于什么设计目的而改变这种继承方式的呢?

------解决方案--------------------
二义性
ex

class a
{
public virtual int test();
}
class b
{
public virtual int test();
}
class c:a,b
{
//
overrider test();
}
c c1 =... 
c1.test() //
------解决方案--------------------

就是,像c++这种传统的OO语言,都没能很好控制多继承,
所以java,c#都已经舍弃了多继承,改用更加窄的接口
------解决方案--------------------
多重继承太混乱了,所以要用单继承,这是C#的优点,
多接口只是定义了一些规范,这个比较深奥,不是一两句能说清楚的,可以看看设计模式
------解决方案--------------------
其实接口可以说并不存在的二义性问题。

Interface a
{
int test();
}
Interface b
{
int test();
}
class c:a,b
{
//
overrider test();
}
c c1 =...
c1.test()

因为接口的函数没有函数体, a.test() 或 b.test() 无所谓。

但是类就不一样了,因为它可以定义函数体。
abstract class a
{
public abstract int test()
{
consoli.write('a');
}
}
abstract class b
{
public abstract int test()
{
consoli.write('b');
}

 
class c:a,b
{
//
overrider test();
}
c c1 =...
c1.test() // 


------解决方案--------------------
其实接口可以说并不存在的二义性问题。

Interface a
{
int test();
}
Interface b
{
int test();
}
class c:a,b
{
//
overrider test();
}
c c1 =...
c1.test()

因为接口的函数没有函数体, a.test() 或 b.test() 无所谓。

但是类就不一样了,因为它可以定义函数体。
abstract class a
{
public abstract int test()
{
consoli.write('a');
}
}
abstract class b
{
public abstract int test()
{
consoli.write('b');
}

 
class c:a,b
{
//
overrider test();
}
c c1 =...
c1.test() // 


------解决方案--------------------
其实接口可以说并不存在的二义性问题。

Interface a
{
int test();
}
Interface b
{
int test();
}
class c:a,b
{
//
overrider test();
}
c c1 =...
c1.test()

因为接口的函数没有函数体, a.test() 或 b.test() 无所谓。

但是类就不一样了,因为它可以定义函数体。
abstract class a
{
public abstract int test()
{
consoli.write('a');
}
}
abstract class b
{
public abstract int test()
{
consoli.write('b');
}

 
class c:a,b
{
//
overrider test();
}
c c1 =...
c1.test() // 


------解决方案--------------------
总结来讲就是更加接近JAVA,当初MS推出C#对手就是JAVA。java和C#都是单继承多接口。多继承容易出错是程序员实践中总结来的
------解决方案--------------------
单一继承更符合真实的世界。面向对象本身起源于实际生活。
------解决方案--------------------
呵呵,每个语言都有自己的特点,C++中需要多实现继承的地方,C#中可能通过改变一下设计也可以达到相同的目的。C++中的多继承有好处也有坏处,灵活代码紧凑,但难写也难懂,一个选择的问题。或许是考虑降低C#编程的门槛,许就是当时制定语言规范的那个小组坐在会议室里一投票,ok就这么着了……
------解决方案--------------------
多继承较之多接口更难合理的应用,这个是为什么除了C++和Effel提供这个东西,其他的OOP语言都不提供多继承。

个人感觉是简单的多继承很容易控制,不会犯错,但是复杂的情况下面多继承很难控制,容易出错——很多时候都不知道类型怎么设计才合理。相比之下多接口的设计更容易理解。
------解决方案--------------------