wake-up-neo.com

Kann eine Klasse zwei Klassen erweitern?

Meine Klasse sollte zwei Klassen gleichzeitig erweitern:

public class Preferences extends AbstractBillingActivity {

public class Preferences extends PreferenceActivity {

Wie geht das?

Upd. Da dies nicht möglich ist, wie sollte ich dann AbstractBillingActivity mit Voreinstellungen verwenden?

Upd2. Wenn ich mit Schnittstellen gehe, sollte ich Folgendes erstellen:

  1. Rechnungsschnittstelle

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

    public interface PreferenceActivity {
    
    }
    
  3. AbstractBillingActivity

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

und dann 

public class Preferences implements BillingInterface {
50
LA_

Java unterstützt keine Mehrfachvererbung.

Es gibt ein paar Problemumgehungen, an die ich denken kann:

Die erste ist die Aggregation: Erstellen Sie eine Klasse, die diese beiden Aktivitäten als Felder übernimmt.

Die zweite ist die Verwendung von Schnittstellen.

Die dritte ist, Ihr Design zu überdenken: Ist es sinnvoll, dass eine Preferences-Klasse sowohl eine PreferenceActivity als auch eine AbstractBillingActivity ist?

41

Java unterstützt keine Mehrfachvererbung. Sie können mehrere Schnittstellen implementieren, jedoch nicht mehrere Klassen erweitern.

22
Mat

Eine andere Lösung besteht darin, eine private innere Klasse zu erstellen, die die zweite Klasse erweitert. B. eine Klasse, die JMenuItem und AbstractAction erweitert: 

public class MyClass extends JMenuItem {


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

}
10
Jonny Rimkus

Java 1.8 (wie auch Groovy und Scala) hat eine Funktion namens " Interface Defender Methods ", bei der es sich um Schnittstellen mit vordefinierten Standard-Method-Body handelt. Durch die Implementierung mehrerer Schnittstellen, die Defender-Methoden verwenden, können Sie das Verhalten von zwei Schnittstellenobjekten auf eine Weise erweitern.

Außerdem können Sie in Groovy mit der Annotation @Delegate das Verhalten von zwei oder mehr Klassen erweitern (mit Vorbehalten, wenn diese Klassen Methoden mit demselben Namen enthalten). Dieser Code beweist es:

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
7
djangofan

Nein, Sie können keine Klasse auf zwei Klassen erweitern lassen.

Eine mögliche Lösung besteht darin, es von einer anderen Klasse aus zu erweitern und dass Klasse von einer anderen Klasse wieder auszudehnen.

4
Jules

Java unterstützt keine Mehrfachvererbung. Ihr Problem kann jedoch mithilfe von Schnittstellen gelöst werden.

Die einfachste Lösung wäre, ein Interface für AbstractBillingActivity und PreferenceActivity zu erstellen und beide umzusetzen.

2
nejckorasa

Sie fragen nach Mehrfachvererbung, was aus verschiedenen Gründen sehr problematisch ist. Mehrfachvererbung wurde speziell in Java vermieden. Es wurde entschieden, die Implementierung mehrerer Schnittstellen zu unterstützen. Dies ist die geeignete Lösung.

1
Paul Sonier

Java unterstützt keine Mehrfachvererbung. Aus diesem Grund können Sie eine Klasse nicht gleichzeitig von zwei verschiedenen Klassen erweitern. 

Verwenden Sie stattdessen eine einzige Klasse, um diese zu erweitern, und verwenden Sie interfaces, um zusätzliche Funktionen hinzuzufügen.

0
MD Sayem Ahmed

In Groovy können Sie Merkmal anstelle von class verwenden. Da sie sich ähnlich wie abstrakte Klassen verhalten (Sie können abstrakte Methoden angeben, aber andere implementieren), können Sie Folgendes tun:

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

Nur um darauf hinzuweisen, es ist nicht genau das Gleiche wie das Erweitern von zwei Klassen, aber in einigen Fällen (wie im obigen Beispiel) kann es die Situation lösen. Ich empfehle dringend, Ihr Design zu analysieren, bevor Sie mit der Verwendung von Merkmalen beginnen. In der Regel sind sie nicht erforderlich und Sie können die Vererbung nicht ordnungsgemäß implementieren (Sie können beispielsweise keine geschützten Methoden in Merkmalen verwenden). Befolgen Sie nach Möglichkeit die Empfehlung der akzeptierten Antwort.

0
lepe

Anstelle innerer Klassen können Sie auch zwei oder mehr Klassen als Felder verwenden.

Zum Beispiel:

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

}

Also, hier haben Sie einen Mann, der ein Telefon mit seiner Nummer und Typ haben kann, außerdem haben Sie DeviceInfo für dieses Telefon.

Möglicherweise ist es auch besser, DeviceInfo als Feld in der Klasse Phone zu verwenden, z

class Phone {
DeviceInfo info;
String phoneNumber;
Stryng phoneType;
//sets; gets
}
0
Dred

Ich kann mir eine Problemumgehung vorstellen, die hilfreich sein kann, wenn die Klassen, die Sie erweitern möchten, nur Methoden enthalten.

Schreiben Sie diese Klassen als Schnittstellen. In Java können Sie eine beliebige Anzahl von Schnittstellen implementieren und die Methoden als Standardmethoden in den Schnittstellen implementieren.

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

0
CrazySynthax

Wenn Sie Methoden aus mehreren Klassen verwenden möchten, verwenden Sie am besten Composition anstelle von Inheritence

0
Santhosh

Mehrstufige Hierarchie kennen?

Sie können eine Unterklasse als Superklasse für eine andere Klasse verwenden.

Sie können es versuchen.

public class PreferenceActivity extends AbstractBillingActivity {}

dann

public class Preferences extends PreferenceActivity {}

In diesem Fall erbt die Preferences-Klasse auch PreferencesActivity und AbstractBillingActivity.

0
AyukNayr