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