假设我有一个继承自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函数的实现?
答案 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的定义是匿名类,因此无法获取该代码。可能有一些疯狂的反思步骤,以使其工作,但不要担心。如果要重用某些类定义,请将其设置为自己的命名类。