어떻게해야합니까 :
public class Main extends ListActivity , ControlMenu
또한이 접근법은 클래스의 메뉴를 ControlMenu로 만들고 나머지 활동으로 확장하고 있음을 알고 싶습니다.
답변
단일 클래스 만 확장 할 수 있습니다. 그리고 많은 소스에서 인터페이스를 구현하십시오.
여러 클래스를 확장 할 수 없습니다. 내가 생각할 수있는 유일한 해결책은 클래스를 상속하지 않고 각 클래스의 내부 변수를 사용하고 요청을 객체로 요청으로 리디렉션하여 프록시를 더 많이 수행하는 것입니다.
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();
}
}
이것이 내가 생각해 낸 최고의 솔루션입니다. 두 클래스에서 기능을 얻을 수 있으며 실제로는 하나의 클래스 유형 만 가능합니다.
단점은 캐스트를 사용하여 내부 클래스의 금형에 맞출 수 없다는 것입니다.
답변
내부 클래스를 사용하지 않는 이유 (Nesting)
class A extends B {
private class C extends D {
//Classes A , B , C , D accessible here
}
}
답변
다른 사람들이 말했듯이. 아냐, 못해 그러나 사람들이 수년에 걸쳐 여러 인터페이스를 사용해야한다고 말했지만 실제로는 그 방법을 다루지 않았습니다. 잘하면 이것이 도움이 될 것입니다.
가지고 class Foo
있고 class Bar
둘 다로 확장하려고 한다고 가정 해보십시오 class FooBar
. 물론, 당신이 말했듯이, 당신은 할 수 없습니다 :
public class FooBar extends Foo, Bar
사람들은 이미 이것에 대한 이유에 들어갔다. 대신, 쓰기 interfaces
모두 Foo
및 Bar
공개 방법을 모두 커버. 예 :
public interface FooInterface {
public void methodA();
public int methodB();
//...
}
public interface BarInterface {
public int methodC(int i);
//...
}
그리고 지금 확인 Foo
하고 Bar
상대적 인터페이스를 구현 :
public class Foo implements FooInterface { /*...*/ }
public class Bar implements BarInterface { /*...*/ }
자, 함께 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);
}
//...
}
이 방법의 보너스는 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);
이것이 여러 확장 대신 인터페이스를 사용하는 방법을 명확히하기를 바랍니다. 내가 몇 년 늦었어도.
답변
인터페이스를 사용하려고합니다. 일반적으로 다이아몬드 문제로 인해 다중 상속이 잘못되었습니다.
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는 인터페이스 만 사용합니다.
: 자바 산책로 인터페이스에 큰 소개가 http://download.oracle.com/javase/tutorial/java/concepts/interface.html을
당신은 아마 따르도록 할 것을 그 안드로이드 API의 뉘앙스로 다이빙을하기 전에.
답변
그러나 다른 사람들이 쓴 것처럼 Java에서는 다중 상속을 수행 할 수 없습니다. 코드를 사용하려는 클래스가 두 개인 경우 일반적으로 클래스를 하나만 하위 클래스 화 A
합니다. class의 B
경우 중요한 메소드를 인터페이스 BInterface
(추악한 이름이지만 아이디어를 얻음)에 추상화 한 다음 말합니다.Main extends A implements BInterface
. 내부에서 클래스의 객체를 인스턴스화하고 의 해당 함수를 호출하여 B
모든 메소드를 구현할 수 있습니다 .BInterface
B
이렇게하면 “is-a”관계가 “has-a”관계로 변경됩니다. Main
현재는 A
이지만 B
. 유스 케이스에 따라 클래스 BInterface
에서 를 제거하여 변경 사항을 명시 적으로 지정 A
하고 대신 B 객체에 직접 액세스하는 방법을 제공 할 수도 있습니다.
답변
인터페이스를 만드십시오. Java에는 다중 상속이 없습니다.
http://csis.pace.edu/~bergin/patterns/multipleinheritance.html
답변
Java는 다중 상속을 지원하지 않지만 둘 이상의 인터페이스를 구현할 수 있습니다.