Java抽象类实现

时间:2010-07-07 21:52:50

标签: java

假设我有一个继承自A的抽象类A和抽象类B,我创建了一个类A的对象,如下所示:

abstract class A {
   void func1();
}

abstract class B extends A {
   void func2();
}

A objectA = new A() {
   func1(){
      //implementation
   }
};

我有办法做这样的事情:

B objectB = new B(objectA) {
   func2(){
      //implementation
   }
};

以便objectB从objectA获取A函数的实现?

4 个答案:

答案 0 :(得分:3)

你可以这样做(通过组合,因为你将无法从匿名内部类objectA继承):

 abstract class A {
    abstract void func1();
 }

 abstract class B extends A {
     A wrapped;
     public B(A objectA) {
         wrapped = objectA;
     }
    abstract void func2();
 }

 A objectA = new A() {
    void func1(){
       //implementation
    }
 };

 B objectB = new B(objectA) {
    public void func1() {
        wrapped.func1();
    }
    public void func2() {
        // impl
    }
 };

AFAIK您无法在objectB中定义新的构造函数,因此您必须在B类中声明它。

答案 1 :(得分:2)

我明白你想做什么。例如,在Ruby中这样的事情是可能的。在Java中,这是不可能的,因为

new A() { 
   func1(){  } 
}; 

不是A类型,而是A的匿名子类,不是 B的超类。编译器为此生成一些$1类。

但总的来说,尝试另一种方法:“赞成合成而不是继承”。然后只需使用两个Strategy类就能将func1和func2组合在一起。因此,如果B未使用任何A状态,您可以委托给objectA(必须是final):

B objectB = new B() { 
   func1(){ 
     objectA.func1()
   } 
   func2(){ 
     //implementation 
   } 
}; 

这与bashflyng的答案相似,但更直接。

答案 2 :(得分:0)

抽象类是一个声明为abstract的类 - 它可能包含也可能不包含抽象方法。因此,如果你知道其中一个(可能是默认的)具体实现,你可以提供func1()的实现,它仍然可以是抽象的。 虽然没有回答你的问题(我认为答案是否定的);

答案 3 :(得分:0)

没有。您对A的定义是匿名类,因此无法获取该代码。可能有一些疯狂的反思步骤,以使其工作,但不要担心。如果要重用某些类定义,请将其设置为自己的命名类。