摘自java编程思想,个人感觉只不过是维护了一个E的子类对象而已,这也算多重继承?       class D
       {
} abstract class E
{
} class Z extends D
{
E makeE()
{
return new E()
{
};
}
} public class MutiImplementation
{
static void takesD(D d){}
static void takesE(E e){}
public static void main(String[] args)
{
Z z = new Z();
takesD(z);
takesE(z.makeE());
}
}

解决方案 »

  1.   

    个人认为,java只有单继承,可以通过接口来实现多重继承。
      

  2.   

    Z中并不能直接访问E的成员,只能通过调用makeE方法得到E的实例,然后才能访问。
      

  3.   

    匿名内部类实现多继承啊返回的是E的子类, 没什么问题吧????E的子类肯定是继承与E啊,
    继承当然是为了复用啊,这样我们不是优雅的实现了?
      

  4.   

    我举个例子看看先class E{}
    class D{E e;}那你这说法,这个里面的D就继承了E?
    再就是我还有个疑问,既然是继承了 也就是说子类是父类的关系,
    你可以认为java编程思想那例子中Z就是E
    那么 takesE(z.makeE()); 这个调用我应该是takesE(z);也可以的咯
      

  5.   

    其实看了半天没明白你的意思
    能不能详细点你只说了匿名内部类是继承了E 那就说明了Z继承了E么
      

  6.   

    第一问 你写这个明显是组合关系。 e的内部方法可以访问D的 私有变量么?第二问 什么叫模拟多继承?  java 是不支持多继承的  。  但是有时为了方便复用我们就模拟多继承而已。你说的问题,我们这样实现 只是在实现了 与 C++ 中多继承类似的结果, 但java中并不支持多继承。
    Z就是E   当然不是 。 Z不是E 因为他没继承E啊。只是说用匿名内部类模拟实现多继承 。
      

  7.   


    接着你的话题说哈
    第一个问题,“e的内部方法可以访问D的 私有变量么?”不明白你这句话想要说明什么
    也许你想说明的是
    class Z extends D
        {
           private int a;
            E makeE()
            {
                return new E()
                {
                        public void b(){
                         a=1;   
                         }
                };
            }
        }
    如果是那继续看下面,不是那麻烦把你的想法再表达下
    第二个问题,我明白你的意思了,你就是说这只是做一个模拟,我当然知道Java不能多继承类,虽然我java不能算多好,还是学过些的,我想问的是这能算一个成功的模拟么
    就拿这个匿名内部类来说,如果是这样的话,我匿名内部类里面增加子类自己的方法,Z能访问吗(不用反射),如果按继承来说,子类增加自己的方法,访问什么的都OK吧
    就像上面那个public void b(),定义在Z里面的话也没办法访问匿名子类的私有成员吧
    如果不用匿名内部类,就用一个与方法同层次的内部类继承了E,那么在内部类中我想定义个私有的成员覆盖父类的成员怎么办 abstract class E
     {
     protected int a;
     } class Z extends D
     {
     class F extends E{
     private int a;
     }
         E makeE()
         {
             return new F();
         }
     }Z能访问到F里面的a么
      

  8.   

     
    一个简单的例子
    class E{
       public print(){System.out.println("print in E");}
    }
    class Z extends E{
       private int a;
       public print(){println();}
       private println(){System.out.println()}
    }
    我们平时写的继承  E z=new Z();
    这个多态你是不可以通过对象组合来实现的
    这个多态用内部类实现
    class Z extends D
        {   
             private int a;
                E makeE()
            {
                return new E()
                {
                        public void println(){
                          System.out.println(a);
                         }
                };
            }
        }这是第一个问题。 说明 用匿名内部类 和 使用组合的差别第二个问题 
    就拿这个匿名内部类来说,如果是这样的话,我匿名内部类里面增加子类自己的方法,Z能访问吗(不用反射),如果按继承来说,子类增加自己的方法,访问什么的都OK吧
    就像上面那个public void b(),定义在Z里面的话也没办法访问匿名子类的私有成员吧
    如果不用匿名内部类,就用一个与方法同层次的内部类继承了E,那么在内部类中我想定义个私有的成员覆盖父类的成员怎么办首先你需要实现的 Z继承于E ,为什么要在匿名内部里增加方法, 在匿名内部类里你只需要把需要重写的方法写出来,其它的都继承于E就可以,  因为你要实现的事Z继承E , 你把需要拓展的方法写到Z里面不就行了?
    你把继承层次搞清楚。  Z可以随便增加自己的方法  还可以通过内部类重写 E的方法 。 你说的你要定义私有成员覆盖父类成员 那你直接在Z中定义不就可以了??看下面例子 abstract class E{
    private int i=2;
    abstract void increments();
    abstract void print();
    }
    public class Z {
    private int i=0;
    class F extends E{

    public void increments(){ i++;}
    public void print(){System.out.println("i="+i);};

    }
    public E makeE(){

    return new F();
    }
    public static void main(String [] args){
    Z z=new Z();
    E e=z.makeE();
    e.increments();
    e.print();
    }
    }
    结果  
    i=1还需要解释什么? 还有什么继承机制没实现呢?   要明确记住 是 Z继承E 
      

  9.   


    abstract class E
    {
    protected int a;
    }class Z extends D
    {
    class F extends E
    {

    }

    public void c(){
    //在Z中增加的子类扩展方法,如何访问父类的a
    } E makeE()
    {
    return new F();
    }
    }
      

  10.   

     abstract class E{
    protected int j=2;
    abstract void increments();
    abstract void print();
    }
    public class Z {
    private int i=0;
    private F f;
    public Z(){f=new F();}
    public int getJandAddI(){
    return f.getJandAddI();
    }
    class F extends E{
        public int getJandAddI(){return j+i;};
    public void increments(){ i++;}
    public void print(){System.out.println("i="+i);};

    }
    public E makeE(){

    return f;
    }
    public static void main(String [] args){
    Z z=new Z();
    E e=z.makeE();
            System.out.println(z.getJandAddI());
    }
    }
    把需要用到父类字段的方法 在子类中写好,再在外部类中 提供接口 
      

  11.   

    static void takesD(D d){}
            static void takesE(E e){}
            public static void main(String[] args)
            {
                Z z = new Z();
                takesD(z);
                takesE(z.makeE());
            }
    z是D的子类,方法takesD(D d){}的参数是D,传一个子类没问题啊
    takesE(E e){}的参数是E,传递的是E的匿名实现类,也没问题呀,
    哪有多继承
      

  12.   

    java编程思想说用匿名内部类实现的多重继承,给的例子就是这个例子
      

  13.   

    Coder们过节过完没啊来给点看法撒
      

  14.   

    这么说吧 继承了是不是表示还满足多态
    public static void main(String [] args){
    Z z=new Z();
    E e=z.makeE();
      System.out.println(z.getJandAddI());
    }
    借你这段代码说,e强转成Z会出错,强转成F又如何调用Z新增的扩展方法
    和这样实现感觉还是存在很多疑惑,即使实现出来这样的继承也是个残品吧?(没再细想,感觉有一些特性无法实现)
      

  15.   

    这个不算多继承,java里没有多继承。
    Z只单独继承于D,这个只是通过聚合关系,让Z能调用E的方法。
      

  16.   

    他的意思是java里面没有多继承这个语法,如果你想干多继承的事情,就是一个类拥有两个不同类的方法,就用他给的方式,两个不同类的方法你都能用了。
      

  17.   

    我拥有它的引用一样可以实现不同方法调用,代理不就是这样么
    java编程思想说只能用内部类来实现,我想看看到底有何特别之处
      

  18.   

    如果 C 既是 A 的子类,又是 B 的子类,但是 A 与 B 完全没有任何关系,那就表示 C 多重继承了 A 和 B,这样的关系才是多重继承。
      

  19.   


    是不是多重继承得使用 instanceof 运算符。对象 z instanceof E 为 true 么?很明显不是,这里的 makeE 只是一个产生 E 对象的工厂方法。虽然这个 E 对象能够使用 Z 类中的数据,但是 Z 类本身与 E 类是没有任何父子关系的。Z 与 makeE 中 E 的关系是工厂与产品的关系,而不是父与子的关系。
      

  20.   


    如果 instanceof 成立了, 那当然那是多继承了, 所以说是模拟多继承,instanceof当然不成立
    注意我们的论调是  这个是否模拟了多继承 ,  它根本不是多继承,如果我们以复用的角度来看,我认为 ,
    这个实现确实模拟了多继承。