Расширение от двух классов



Как я могу сделать это:



public class Main extends ListActivity , ControlMenu 


кроме того, я хотел бы знать, что этот подход в порядке, что я сделал меню в классе, который является ControlMenu и я расширяюсь в остальной части деятельности.

206   11  

11 ответов:

вы можете расширить только один класс. И реализовать интерфейсы из многих источников.

расширение нескольких классов недоступно. Единственное решение, которое я могу придумать, - это не наследовать ни один класс, а вместо этого иметь внутреннюю переменную каждого класса и делать больше прокси, перенаправляя запросы к вашему объекту на объект, к которому вы хотите их перейти.

 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();
     }
 }

Это лучшее решение, которое я придумал. Вы можете получить функциональность от обоих классы и по-прежнему только на самом деле быть одного типа класса.

недостатком является то, что вы не можете поместить в форму внутреннего класса, используя гипс.

почему бы не использовать внутренний класс (вложенность)

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

вы хотите использовать интерфейсы. Как правило, множественное наследование плохо из-за проблемы с Алмазом:

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 имеют большое введение на интерфейсах:http://download.oracle.com/javase/tutorial/java/concepts/interface.html Вы, вероятно, захотите следить за этим, прежде чем погружаться в нюансы в Android ПРИКЛАДНОЙ ПРОГРАММНЫЙ ИНТЕРФЕЙС.

как все уже говорили. Нет, вы не можете. Однако, хотя люди много раз говорили на протяжении многих лет, что вы должны использовать несколько интерфейсов, они на самом деле не пошли в том, как. Надеюсь, это поможет.

скажи, что у тебя есть 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);

надеюсь, что это проясняет, как использовать интерфейсы вместо нескольких расширений. Даже если я опоздаю на несколько лет.

да, как все остальные писали, вы не можете сделать множественное наследование в Java. Если у вас есть два класса, из которых вы хотите использовать код, вы обычно просто подкласс один (скажем class A). Для класса 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 не поддерживает множественное наследование, но вы можете попробовать реализовать два или более интерфейса.

да. сландау прав. Java не позволяет расширяться из нескольких классов.

то, что вы хотите, вероятно,public class Main extends ListActivity implements ControlMenu. Я предполагаю, что вы пытаетесь составить список.

надеюсь, что это поможет.

расширение из нескольких классов не допускается в java.. чтобы предотвратить смертельный Алмаз смерти !

возможно

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

//blah
}

Как и другая альтернатива, возможно, вы можете использовать интерфейс с реализацией метода по умолчанию. Это зависит, конечно, от того, что вы хотите сделать.

например, вы можете создать абстрактный класс и интерфейс:

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();
    }
}

надеюсь, что это поможет вам...

Comments

    Ничего не найдено.