一班可以延长两班吗?


72

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

public class Preferences extends AbstractBillingActivity {

public class Preferences extends PreferenceActivity {

怎么做?

更新。由于这是不可能的,那么我应该如何将那个AbstractBillingActivity和Preferences一起使用?

Upd2。如果我使用接口,我应该创建:

  1. 计费接口

    public interface BillingInterface extends PreferenceActivity, AbstractBillingActivity {
    
    }
    
  2. 偏好活动

    public interface PreferenceActivity {
    
    }
    
  3. 抽象帐单活动

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

接着

public class Preferences implements BillingInterface {


1
@LA_:一个类可以实现多个接口,但只能扩展一个类,因此,如果需要,您可以使用所有接口来实现您的类,而无需将所有接口合并为一个接口。
阿萨德·拉希德

一旦将AbstractBillingActivity和PreferenceActivity创建为接口,就无需创建另一个名为BillingInterface的接口。而是使用以下代码:公共类Preferences实现了AbstractBillingActivity,PreferenceActivity
Logan

Answers:


68

Java不支持多重继承。

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

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

第二是使用接口。

第三是重新考虑您的设计:将一个Preferences类同时作为aPreferenceActivity an有意义AbstractBillingActivity吗?


26

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


那么,我应该如何将那个AbstractBillingActivity(github.com/robotmedia/AndroidBillingLibrary)和Preferences一起使用?
LA_ 2011年

1
我不知道。乍一看,想要扩展称为Preferences和的东西并BillingActivity没有任何意义。我看不到两者之间的任何联系。如果您的首选项需要存储计费活动内容,则使用组合,反之亦然。

在哪里可以阅读有关构图的信息?对我来说这是新事物。或者,您能举个例子吗?谢谢。
LA_ 2011年

合成只是将一个对象作为另一个对象的成员。

18

另一个解决方案是创建一个扩展第二类的私有内部类。例如扩展JMenuItem和的类AbstractAction

public class MyClass extends JMenuItem {


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

}

11

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

2
附录:我撤消了这个答案:从那以后,我了解到,如果您需要类似于多重继承的行为,则可能要使用“对象组合”。同样,实现多个接口也不会像多重继承一样:您不能拥有一个实现两个接口的类,其中两个接口都包含具有相同签名的默认方法,除非该类为该方法本身提供了一个实现。因此,我们仍然有效地拥有单一继承。一直在学习...
djangofan

6

不,您不能使一个类扩展到两个类。

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


1
通过这种方法,我们真的可以实现上述目标吗?如果知道的话。
Inzimam Tariq IT

3

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

最简单的解决方案是为其创建一个接口,AbstractBillingActivityPreferenceActivity同时实现它们。


接口(实现)与继承(扩展)无关。
尤金·卡尔托耶夫

1

您要问的是多重继承,由于多种原因,这是非常成问题的。在Java中特别避免了多重继承。而是选择支持多接口实现,这是适当的解决方法。


我有一个问题要问..我认为Java中存在多重继承。让我解释一下A类B类。A类扩展了B类,而A类也扩展了对象类。因此,怎么说Java不支持多重继承
。– ZIJ

1

熟悉多层次结构?

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

你可以试试看

public class PreferenceActivity extends AbstractBillingActivity {}

然后

public class Preferences extends PreferenceActivity {}

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


0

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

而是,使用单个类从中扩展并用于interfaces包含其他功能。


你能检查我的问题吗,upd2?我以前从未使用过接口。
LA_ 2011年


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

}

因此,在这里您可以拥有一个可以使用其电话号码和类型输入某些Phone的人,也可以使用该Phone的DeviceInfo。

另外,最好将DeviceInfo用作Phone类的字段,例如

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

0

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


2
您好,欢迎来到!请添加一些代码或示例,以便其他人可以很好地理解它。
Devang Padhiyar

0

在Groovy中,可以使用trait而不是class。由于它们的行为类似于抽象类(可以指定抽象方法,但仍可以实现其他方法),因此可以执行以下操作:

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.