从两个类扩展

uma*_*mar 142 java android

我怎样才能做到这一点:

public class Main extends ListActivity , ControlMenu 
Run Code Online (Sandbox Code Playgroud)

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

The*_*der 150

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

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

 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();
     }
 }
Run Code Online (Sandbox Code Playgroud)

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

缺点是你不能使用强制转换适合内部类的模具.

  • 你更快:)我会把我的答案作为一些抽象的漫无边际的比较你的具体例子;) (2认同)

小智 52

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

class A extends B {
    private class C extends D {
        //Classes A , B , C , D accessible here 
    }
}
Run Code Online (Sandbox Code Playgroud)

  • Intersting方法,专家对这种技术的看法是什么?我想深入研究它. (4认同)
  • 无法让内部类在“片段”中工作。我的活动必须扩展`Fragment`,这意味着我绝对需要`getView()`,如果它在内部类内部,它将无法正常工作,并且其中的代码需要使用ListActivity中的代码,因此我不能扩展两次,或者在此示例中执行内部类。 (2认同)

SCB*_*SCB 42

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

假设你有class Foo,class Bar并且你们都想尝试扩展到class FooBar.当然,正如你所说,你做不到:

public class FooBar extends Foo, Bar
Run Code Online (Sandbox Code Playgroud)

人们已经在某种程度上了解了这一点.相反,写interfaces两个FooBar涵盖他们所有的公共方法.例如

public interface FooInterface {

    public void methodA();

    public int methodB();

    //...
} 

public interface BarInterface {

    public int methodC(int i);

    //...
}
Run Code Online (Sandbox Code Playgroud)

现在制作FooBar实现相关接口:

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

public class Bar implements BarInterface { /*...*/ }
Run Code Online (Sandbox Code Playgroud)

现在,有了class FooBar,你可以实现这两个FooInterface,BarInterface同时保持一个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);
    }

    //...

}
Run Code Online (Sandbox Code Playgroud)

此方法的好处,是该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);
Run Code Online (Sandbox Code Playgroud)

希望这澄清了如何使用接口而不是多个扩展.即使我迟到了几年.

  • 这是最好的答案 (6认同)

Dav*_*her 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?
}
Run Code Online (Sandbox Code Playgroud)

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

string foo() { return B::foo(); }
Run Code Online (Sandbox Code Playgroud)

但Java只使用接口.

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

  • 我永远不明白为什么钻石问题实际上是一个阻止多重继承的问题.如果存在具有相同名称的冲突方法,为什么编译器不能抱怨? (21认同)

Nic*_*s78 21

是的,正如其他人所写的那样,你不能在Java中做多重继承.如果你有两个类,你想要使用代码,你通常只是一个子类(比如class A).对于类B,你抽象的它的界面的重要方法BInterface(丑陋的名字,但你的想法),然后再说Main extends A implements BInterface.在里面,你可以实例化一个类的对象,BBInterface通过调用相应的函数来实现所有方法B.

这会将"is-a"关系更改为"has-a"关系,因为您Main现在是一个A,但有一个B.根据您的使用情况下,你甚至可能做出的改变明确通过删除BInterface从您的A类,而是提供直接访问您的B对象的方法.


sla*_*dau 11

建立一个界面.Java没有多重继承.

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

  • aww为什么要downvote?我不是很卑鄙,我只是认为他能够在我为他构建课程之前先做一些阅读并自己思考这个问题. (9认同)

小智 6

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


win*_*ter 6

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

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

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.
    }
}
Run Code Online (Sandbox Code Playgroud)

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

public class extends FatherClass implements InterfaceWithDefaultsMethods {

    void methode() {
        methodInherit();
        anotherMethod();
    }
}
Run Code Online (Sandbox Code Playgroud)

希望这对您有帮助...