[java] 두 클래스에서 확장

어떻게해야합니까 :

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모두 FooBar공개 방법을 모두 커버. 예 :

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, 당신은 모두를 구현할 수 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객체가 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모든 메소드를 구현할 수 있습니다 .BInterfaceB

이렇게하면 “is-a”관계가 “has-a”관계로 변경됩니다. Main현재는 A이지만 B. 유스 케이스에 따라 클래스 BInterface에서 를 제거하여 변경 사항을 명시 적으로 지정 A하고 대신 B 객체에 직접 액세스하는 방법을 제공 할 수도 있습니다.


답변

인터페이스를 만드십시오. Java에는 다중 상속이 없습니다.

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


답변

Java는 다중 상속을 지원하지 않지만 둘 이상의 인터페이스를 구현할 수 있습니다.