难割难舍中国心2011-03-16 10:09:08

大家都知道C++有个多态继承(multi-inheritance)的问题,或曰菱形问题。而Java引入Interface后彻底摆脱了多态继承的困扰。

可在下是在才疏学浅,对一些核心问题不甚了了,而一些专业书籍在一些关键问题上往往闪烁其辞,所以我怀疑那些伪专家们对此也是一知半解,因而顾左右而言他。

我最不明白的一点是:为什么多态继承问题只出现在method上,而variable没有这种问题?有人可能会说method有override功能,而variable没有。可我要告诉你:经过鄙人的细心研究,发现无论是在C++还是在Java里,真正的override并不存在。也就是说,所以来自parent class的变量和函数全部都要无条件地在child class里继承。而所谓的override只不过是child class又提供了一个同名同参数同返回值的函数而已,但我可以告诉你这两个同名同参数同返回值的函数是并存的,且完全独立的。

这里我再顺便纠正一个错误概念:许多人认为private的变量和函数是不被继承的。此大谬也!实际上,private的变量不仅能被原封不动地继承,而且还将传之于子孙万代!其实,所有的variables和methods都将被原封不动地继承并被传给子孙万代。因为这才是OOP下父子class之间真实的general与special的关系。只不过,对于私有的method和variable而言,它们在child class里看不到也访问不到,彻底“隐身”了,可是它们却仍然真实地存在着。

下面我写了一段Java代码可以明白无误地证实这一点。我们可以看到,在class private_0下定义的私有变量a和私有函数mnopqrst()在经过了四代继承之后,仍然存在于class private_run里,否则继承下来的公有函数mmnnn()就不可能访问到它们。

好了,言归正传,既然一个child class可以继承所有parent class乃至一切祖先类中的所有变量和函数,那么为什么会有不知道给继承哪个parent class的method的困惑呢?我想绝对不会是所谓命名冲突的问题,因为这非常还解决:只要在每个变量前制定它原生的class,那么所以同名但不同源的变量便可区分开来。

问题绝没有那么简单?望众位高手能指点迷津,不吝赐教!不胜感激敬佩之至!临表涕零,不知所云!

=============================================================================================

import java.io.*;
import java.lang.*;
import java.lang.reflect.*;

class private_0
{
 private int a = 5;
 private void mnopqrst()
 {
  System.out.println( "a =  " + a );
 }
 public void mmnnn()
 {
  mnopqrst();
 }
}

class private_1 extends private_0
{
}

class private_2 extends private_1
{
 private void mnopqrst()
 {
 }
}

public class private_run extends private_2
{
 public static void main( String argv[] )
 {
  private_run private_one = new private_run();
  private_one.mmnnn();
  Class myClass = private_one.getClass();
  Field [] fields = myClass.getFields();
  for( int k = 0; k < fields.length; k++ )
   System.out.println( "fields[" + k + "] = " + fields[k] );
 }
}
==============================================================================================

 

 

GuoLuke22011-03-16 15:16:22
这和多继承有关系吗?
Largo2011-03-16 15:19:19
回复:有哪位高手给详细讲解一下C++里多态继承的问题(或曰菱形问题)
难割难舍中国心2011-03-17 08:11:46
觉得C++的发明者们很猪头
π2011-03-17 15:32:35
哈哈! 如实转告了。