我怎样才能做到这一点:
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)
这是我提出的最佳解决方案.您可以从两个类中获取功能,但实际上只有一个类类型.
缺点是你不能使用强制转换适合内部类的模具.
小智 52
为什么不使用内部类(嵌套)
class A extends B {
private class C extends D {
//Classes A , B , C , D accessible here
}
}
Run Code Online (Sandbox Code Playgroud)
SCB*_*SCB 42
正如其他人所说的那样.不,你不能.然而,即使多年来人们多次说过你应该使用多个接口,但他们还没有真正研究过.希望这会有所帮助.
假设你有class Foo,class Bar并且你们都想尝试扩展到class FooBar.当然,正如你所说,你做不到:
public class FooBar extends Foo, Bar
Run Code Online (Sandbox Code Playgroud)
人们已经在某种程度上了解了这一点.相反,写interfaces两个Foo并Bar涵盖他们所有的公共方法.例如
public interface FooInterface {
public void methodA();
public int methodB();
//...
}
public interface BarInterface {
public int methodC(int i);
//...
}
Run Code Online (Sandbox Code Playgroud)
现在制作Foo并Bar实现相关接口:
public class Foo implements FooInterface { /*...*/ }
public class Bar implements BarInterface { /*...*/ }
Run Code Online (Sandbox Code Playgroud)
现在,有了class FooBar,你可以实现这两个FooInterface,BarInterface同时保持一个Foo和Bar对象,并直接传递方法:
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对象适合两者的模具FooInterface和BarInterface.这意味着这非常好:
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)
希望这澄清了如何使用接口而不是多个扩展.即使我迟到了几年.
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的细微差别之前先了解它.
Nic*_*s78 21
是的,正如其他人所写的那样,你不能在Java中做多重继承.如果你有两个类,你想要使用代码,你通常只是一个子类(比如class A).对于类B,你抽象的它的界面的重要方法BInterface(丑陋的名字,但你的想法),然后再说Main extends A implements BInterface.在里面,你可以实例化一个类的对象,B并BInterface通过调用相应的函数来实现所有方法B.
这会将"is-a"关系更改为"has-a"关系,因为您Main现在是一个A,但有一个B.根据您的使用情况下,你甚至可能做出的改变明确通过删除BInterface从您的A类,而是提供直接访问您的B对象的方法.
sla*_*dau 11
建立一个界面.Java没有多重继承.
http://csis.pace.edu/~bergin/patterns/multipleinheritance.html
与另一种选择一样,也许您可以使用带有方法的默认实现的接口。这当然取决于你想做什么。
例如,您可以创建一个抽象类和一个接口:
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)
希望这对您有帮助...
| 归档时间: |
|
| 查看次数: |
443394 次 |
| 最近记录: |