Может ли один класс расширить два класса? - PullRequest
57 голосов
/ 05 июля 2011

Мой класс должен расширять два класса одновременно:

public class Preferences extends AbstractBillingActivity {

public class Preferences extends PreferenceActivity {

Как это сделать?

Upd . Поскольку это невозможно, как я могу использовать это AbstractBillingActivity с настройками тогда?

UPD2 . Если я иду с интерфейсами, я должен создать:

  1. BillingInterface

    public interface BillingInterface extends PreferenceActivity, AbstractBillingActivity {
    
    }
    
  2. PreferenceActivity

    public interface PreferenceActivity {
    
    }
    
  3. AbstractBillingActivity

    public interface AbstractBillingActivity {
    
            void onCreate(Bundle savedInstanceState);
    
    }
    

, а затем

public class Preferences implements BillingInterface {

Ответы [ 12 ]

47 голосов
/ 05 июля 2011

Java не поддерживает множественное наследование.

Есть несколько обходных путей, о которых я могу подумать:

Первый - агрегирование: создайте класс, который принимает эти два действия в качестве полей.

Второе - использовать интерфейсы.

Третье - переосмыслить ваш дизайн: имеет ли смысл, чтобы класс Preferences был одновременно PreferenceActivity и и AbstractBillingActivity?

23 голосов
/ 05 июля 2011

Java не поддерживает множественное наследование. Вы можете реализовать несколько интерфейсов, но не расширять несколько классов.

12 голосов
/ 19 апреля 2014

Другое решение - создать закрытый внутренний класс, который расширяет второй класс. например, класс, который расширяет JMenuItem и AbstractAction:

public class MyClass extends JMenuItem {


    private class MyAction extends AbstractAction {
        // This class can access everything from its parent...
    }

}
9 голосов
/ 31 октября 2013

В Java 1.8 (а также в Groovy и Scala) есть такая вещь, как « Методы защитника интерфейса », которые представляют собой интерфейсы с предопределенными телами методов по умолчанию.Реализуя несколько интерфейсов, использующих методы защитника, вы могли бы, в некотором роде, расширить поведение двух интерфейсных объектов.

Кроме того, в Groovy, используя аннотацию @Delegate, вы можете расширить поведение двух или болееклассы (с оговорками, когда эти классы содержат методы с тем же именем).Этот код доказывает это:

class Photo {
    int width
    int height
}    
class Selection {
    @Delegate Photo photo    
    String title
    String caption
}    
def photo = new Photo(width: 640, height: 480)
def selection = new Selection(title: "Groovy", caption: "Groovy", photo: photo)
assert selection.title == "Groovy"
assert selection.caption == "Groovy"    
assert selection.width == 640
assert selection.height == 480
4 голосов
/ 05 июля 2011

Нет, вы не можете заставить класс расширяться до двух классов.

Возможное решение - сделать так, чтобы он расширялся от другого класса, и чтобы класс снова расширялся от другого.

2 голосов
/ 25 ноября 2016

Java не поддерживает множественное наследование. Тем не менее, ваша проблема может быть решена с помощью интерфейсов.

Самое простое решение - создать интерфейс для AbstractBillingActivity и PreferenceActivity и реализовать их оба.

1 голос
/ 05 июля 2011

Вы спрашиваете о множественном наследовании, и это очень проблематично по ряду причин.Многократное наследование было специально исключено в Java;вместо этого был сделан выбор для поддержки реализации нескольких интерфейсов, что является подходящим обходным путем.

0 голосов
/ 10 апреля 2019

Если вы заинтересованы в использовании методов из нескольких классов, лучший способ приблизиться к этому - использовать Composition вместо Inheritence

0 голосов
/ 21 марта 2019

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

Например:

Class Man{
private Phone ownPhone;
private DeviceInfo info;
//sets; gets
}
Class Phone{
private String phoneType;
private Long phoneNumber;
//sets; gets
}

Class DeviceInfo{

String phoneModel;
String cellPhoneOs;
String osVersion;
String phoneRam;
//sets; gets

}

Итак, у вас есть человек, у которого может быть какой-нибудь Телефон с его номером и типом, также у вас есть DeviceInfo для этого Телефона.

Также возможно использовать DeviceInfo в качестве поля в классе Phone, например,

.
class Phone {
DeviceInfo info;
String phoneNumber;
Stryng phoneType;
//sets; gets
}
0 голосов
/ 09 февраля 2019

Я могу придумать обходной путь, который может помочь, если классы, которые вы хотите расширить, включают только методы.

Запишите эти классы как интерфейсы. В Java вы можете реализовать любое количество интерфейсов и реализовать методы как методы по умолчанию в интерфейсах.

https://www.geeksforgeeks.org/default-methods-java/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...