一个类可以扩展两个类吗?

时间:2011-07-05 19:09:07

标签: java android multiple-inheritance

我的班级应该同时扩展两个班级:

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);
    
    }
    
  4. 然后

    public class Preferences implements BillingInterface {
    

13 个答案:

答案 0 :(得分:46)

Java不支持多重继承。

我可以想到一些解决方法:

第一个是聚合:创建一个将这两个活动作为字段的类。

第二种是使用接口。

第三是重新考虑你的设计:Preferences课程是PreferenceActivity AbstractBillingActivity是否有意义?

答案 1 :(得分:23)

Java不支持多重继承。您可以实现多个接口,但不能扩展多个类。

答案 2 :(得分:11)

另一个解决方案是创建一个扩展第二个类的私有内部类。 例如,扩展JMenuItemAbstractAction的类:

public class MyClass extends JMenuItem {


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

}

答案 3 :(得分:8)

Java 1.8(以及Groovy和Scala)有一个名为“Interface Defender Methods”的东西,它是与预定义的默认方法体的接口。通过实现使用defender方法的多个接口,您可以在某种程度上有效地扩展两个接口对象的行为。

此外,在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 :(得分:4)

不,你不能让一个类扩展到两个类。

一种可能的解决方案是让它从另一个类扩展,并使 类再次从另一个类扩展。

答案 5 :(得分:2)

Java不支持多重继承。但是,使用接口可以解决您的问题。

最简单的解决方案是为AbstractBillingActivityPreferenceActivity创建一个界面并同时实现它们。

答案 6 :(得分:1)

您要问的是多重继承,并且由于多种原因而存在问题。在Java中特别避免了多重继承;选择是为了支持多个接口实现,相反,这是适当的解决方法。

答案 7 :(得分:0)

Java不支持多重继承,这就是为什么你不能同时从两个不同的类扩展一个类的原因。

相反,使用单个类进行扩展,并使用interfaces包含其他功能。

答案 8 :(得分:0)

熟悉多级层次结构吗?

您可以将子类用作另一个类的超类。

你可以试试这个。

public class PreferenceActivity extends AbstractBillingActivity {}

然后

public class Preferences extends PreferenceActivity {}

在这种情况下,Preferences类也继承了PreferencesActivity和AbstractBillingActivity。

答案 9 :(得分:0)

我想出一种解决方法,如果您要扩展的类仅包含方法,则可以提供帮助。

将这些类编写为接口。在Java中,您可以实现任意数量的接口,并将这些方法实现为接口中的默认方法。

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

答案 10 :(得分:0)

此外,您可以使用2个或更多类作为字段,而不是内部类。

例如:

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
}

答案 11 :(得分:0)

如果您对使用多个类中的方法感兴趣,那么最好的方法是使用Composition而不是Inheritance

答案 12 :(得分:0)

在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

仅需指出,它与扩展两个类并不完全相同,但是在某些情况下(如上述示例),它可以解决这种情况。我强烈建议您在使用特征之前先分析您的设计,通常不需要使用它们,并且您将无法很好地实现继承(例如,不能在特征中使用受保护的方法)。尽可能遵循接受的答案的建议。