从两个类扩展

时间:2011-04-29 19:45:09

标签: java android

我该怎么做:

public class Main extends ListActivity , ControlMenu 

此外,我想知道这种方法是可以的,我已经在课程中制作了ControlMenu的菜单,我正在其余的活动中进行扩展。

13 个答案:

答案 0 :(得分:147)

您只能扩展单个班级。并从许多来源实现接口。

无法扩展多个类。我能想到的唯一解决方案是不继承任何一个类,而是通过将请求重定向到您希望它们转到的对象的每个类的内部变量并执行更多的代理。

 public class CustomActivity extends Activity {

     private AnotherClass mClass;

     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         mClass = new AnotherClass(this);
     }

     //Implement each method you want to use.
     public String getInfoFromOtherClass()
     {
        return mClass.getInfoFromOtherClass();
     }
 }

这是我提出的最佳解决方案。 您可以从两个类中获取功能,但实际上只有一个类类型。

缺点是您无法使用演员表适合内部类的模具。

答案 1 :(得分:49)

为什么不使用内部类(嵌套)

class A extends B {
    private class C extends D {
        //Classes A , B , C , D accessible here 
    }
}

答案 2 :(得分:37)

您将需要使用接口。通常,由于钻石问题,多重继承是不好的:

abstract class A {
 abstract string foo();
}

class B extends A {
 string foo () { return "bar"; }
}

class C extends A  {
 string foo() {return "baz"; }
}

class D extends B, C {
 string foo() { return super.foo(); } //What do I do? Which method should I call?
}

C ++和其他人有几种方法可以解决这个问题,例如

string foo() { return B::foo(); }

但Java只使用接口。

Java Trails对接口进行了很好的介绍:http://download.oracle.com/javase/tutorial/java/concepts/interface.html 在深入了解Android API中的细微差别之前,您可能希望遵循这一点。

答案 3 :(得分:36)

正如其他人所说的那样。不,你不能。然而,即使多年来人们已多次说过你应该使用多个接口,但他们还没有真正进入过。希望这会有所帮助。

假设您有class Fooclass Bar,您想要尝试延伸到class FooBar。当然,正如你所说,你做不到:

public class FooBar extends Foo, Bar

人们已经在某种程度上了解了这个原因。相反,为interfacesFoo写下Bar,涵盖所有公开方法。 E.g。

public interface FooInterface {

    public void methodA();

    public int methodB();

    //...
} 

public interface BarInterface {

    public int methodC(int i);

    //...
}

现在让FooBar实现相关接口:

public class Foo implements FooInterface { /*...*/ }

public class Bar implements BarInterface { /*...*/ }

现在,使用class FooBar,您可以同时实现FooInterfaceBarInterface同时保留FooBar对象并直接传递方法:

public class FooBar implements FooInterface, BarInterface {

    Foo myFoo;
    Bar myBar;

    // You can have the FooBar constructor require the arguments for both
    //  the Foo and the Bar constructors
    public FooBar(int x, int y, int z){
        myFoo = new Foo(x);
        myBar = new Bar(y, z);
    }

    // Or have the Foo and Bar objects passed right in
    public FooBar(Foo newFoo, Bar newBar){
        myFoo = newFoo;
        myBar = newBar;
    }

    public void methodA(){
        myFoo.methodA();
    }

    public int methodB(){
        return myFoo.methodB();
    }

    public int methodC(int i){
        return myBar.methodC(i);
    }

    //...

}

此方法的好处是,FooBar对象适合FooInterfaceBarInterface的模具。这意味着这非常好:

FooInterface testFoo;
testFoo = new FooBar(a, b, c);
testFoo = new Foo(a);

BarInterface testBar;
testBar = new FooBar(a, b, c);
testBar = new Bar(b, c);

希望这能说明如何使用接口而不是多个扩展。即使我迟到了几年。

答案 4 :(得分:21)

是的,正如其他人所写,你不能在Java中进行多重继承。 如果你有两个类,你想要使用代码,你通常只是一个子类(比如class A)。对于类B,您将它的重要方法抽象为接口BInterface(丑陋的名称,但您明白了),然后说Main extends A implements BInterface。在里面,您可以实例化类B的对象,并通过调用BInterface的相应函数来实现B的所有方法。

这会将“is-a”关系更改为“has-a”关系,因为Main现在是A,但有B。根据您的使用情况,您甚至可以通过从BInterface类中删除A来明确更改,而是提供直接访问B对象的方法。

答案 5 :(得分:10)

制作界面。 Java没有多重继承。

http://csis.pace.edu/~bergin/patterns/multipleinheritance.html

答案 6 :(得分:6)

Java不支持多重继承,但您可以尝试实现两个或更多接口。

答案 7 :(得分:4)

是。 slandau是对的。 Java不允许从几个类扩展。

你想要的可能是public class Main extends ListActivity implements ControlMenu。我猜你正在努力制作一份清单。

希望有所帮助。

答案 8 :(得分:3)

与其他选择一样,也许您可​​以使用具有方法的默认实现的接口。 这取决于你想做什么。

例如,您可以创建一个抽象类和一个接口:

public abstract class FatherClass {

    abstract void methodInherit() {
        //... do something
    }
}

public interface InterfaceWithDefaultsMethods {
    default void anotherMethod() {
        //... do something
        //... maybe a method with a callable for call another function.
    }
}

因此,在那之后,您可以扩展并实现这两个类和 使用这两种方法。

public class extends FatherClass implements InterfaceWithDefaultsMethods {

    void methode() {
        methodInherit();
        anotherMethod();
    }
}

希望这可以帮助你...

答案 9 :(得分:2)

java中不允许从多个类扩展.. 防止Deadly Diamond of death

答案 10 :(得分:1)

可能

public class ParallaxViewController<T extends View & Parallaxor> extends ParallaxController<T> implements AbsListView.OnScrollListener {

//blah
}

答案 11 :(得分:0)

java的创建者认为多重继承的问题大于收益,因此它们不包括多重继承。您可以阅读有关多重继承的最大问题之一(双重钻石问题)here

两个最相似的概念是接口实现,并且包括其他类的对象作为当前类的成员。在接口中使用默认方法几乎与多重继承完全相同,但是,仅使用默认方法的接口被认为是不好的做法。

答案 12 :(得分:0)

您不能在Java中进行多重继承。考虑使用接口:

interface I1 {}
interface I2 {}
class C implements I1, I2 {}

或内部类:

class Outer {
    class Inner1 extends Class1 {}
    class Inner2 extends Class2 {}
}