Подтвердить что ты не робот

Может ли один класс расширить два класса?

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

public class Preferences extends AbstractBillingActivity {

public class Preferences extends PreferenceActivity {

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

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

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

  • BillingInterface

    public interface BillingInterface extends PreferenceActivity, AbstractBillingActivity {
    
    }
    
  • PreferenceActivity

    public interface PreferenceActivity {
    
    }
    
  • AbstractBillingActivity

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

а затем

public class Preferences implements BillingInterface {
4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

Ответ 3

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

public class MyClass extends JMenuItem {


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

}

Ответ 4

В 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

Ответ 5

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

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

Ответ 6

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

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

Ответ 7

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

Ответ 8

Java не поддерживает множественное наследование, поэтому вы не можете продлить класс из двух разных классов одновременно.

Скорее, используйте один класс для расширения и используйте interfaces для добавления дополнительных функций.

Ответ 9

Знакомы с многоуровневой иерархией?

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

Вы можете попробовать это.

public class PreferenceActivity extends AbstractBillingActivity {}

затем

public class Preferences extends PreferenceActivity {}

В этом случае класс Preferences наследует как PreferencesActivity, так и AbstractBillingActivity.

Ответ 10

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

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

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

Ответ 11

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

Например:

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
}

Ответ 12

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

Ответ 13

В Groovy вы можете использовать trait вместо класса. Поскольку они действуют аналогично абстрактным классам (таким образом, вы можете указывать абстрактные методы, но вы все равно можете реализовывать другие), вы можете сделать что-то вроде:

trait EmployeeTrait {
    int getId() {
         return 1000 //Default value
    }
    abstract String getName() //Required
}

trait CustomerTrait {
    String getCompany() {
        return "Internal" // Default value
    }
    abstract String getAddress()
}

class InternalCustomer implements EmployeeTrait, CustomerTrait {
    String getName() { ... }
    String getAddress() { ... }
}

def internalCustomer = new InternalCustomer()
println internalCustomer.id // 1000
println internalCustomer.company //Internal

Просто отметим, что это не совсем то же самое, что расширение двух классов, но в некоторых случаях (например, в приведенном выше примере) это может разрешить ситуацию. Я настоятельно рекомендую проанализировать ваш дизайн, прежде чем переходить к использованию признаков, обычно они не требуются, и вы не сможете красиво реализовать наследование (например, вы не можете использовать защищенные методы в признаках). Следуйте рекомендациям принятого ответа, если это возможно.