Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 一个班能扩展两个班吗?_Java_Android_Multiple Inheritance - Fatal编程技术网

Java 一个班能扩展两个班吗?

Java 一个班能扩展两个班吗?,java,android,multiple-inheritance,Java,Android,Multiple Inheritance,我的班级应该同时扩展两个班级: public class Preferences extends AbstractBillingActivity { public class Preferences extends PreferenceActivity { 如何做到这一点 Upd。既然这是不可能的,那么我应该如何在首选项中使用它呢 Upd2。如果我使用接口,我应该创建: 计费接口 public interface BillingInterface extends PreferenceActi

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

public class Preferences extends AbstractBillingActivity {

public class Preferences extends PreferenceActivity {
如何做到这一点

Upd。既然这是不可能的,那么我应该如何在首选项中使用它呢

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

  • 计费接口

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

    public interface PreferenceActivity {
    
    }
    
  • 抽象比林活动

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

    public class Preferences implements BillingInterface {
    

    Java不支持多重继承

    我可以想出一些变通办法:

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

    第二是使用接口


    第三个问题是重新思考您的设计:
    Preferences
    类既是
    PreferenceActivity
    又是
    AbstractBillingActivity
    ,这有意义吗?

    否您不能使一个类扩展为两个类


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

    您要问的是多重继承,它有很多问题。Java特别避免了多重继承;相反,我们选择支持多接口实现,这是合适的解决方法。

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

    相反,使用单个类进行扩展,并使用
    接口
    包含附加功能。

    Java1.8(以及Groovy和Scala)有一个名为“”的东西,它是带有预定义默认方法体的接口。通过实现使用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
    

    另一个解决方案是创建扩展第二个类的私有内部类。 e、 g扩展
    JMenuItem
    AbstractAction
    的类:

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

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


    最简单的解决方案是为
    AbstractBillingActivity
    PreferenceActivity
    创建一个接口,并将它们都实现。

    熟悉多级层次结构吗

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

    你可以试试这个

    public class PreferenceActivity extends AbstractBillingActivity {}
    
    然后


    在这种情况下,Preferences类同时继承PreferencesActivity和AbstractBillingActivity。

    如果要扩展的类只包含方法,我可以想出一种解决方法

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


    此外,您可以使用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
    }
    

    如果您对使用来自多个类的方法感兴趣,最好的方法是使用组合而不是继承,在Groovy中,您可以使用而不是类。由于它们的行为类似于抽象类(您可以指定抽象方法,但仍可以实现其他方法),因此可以执行以下操作:

    trait EmployeeTrait{
    int getId(){
    返回1000//默认值
    }
    抽象字符串getName()//必需
    }
    特质顾客{
    字符串getCompany(){
    返回“内部”//默认值
    }
    抽象字符串getAddress()
    }
    类InternalCustomer实现EmployeeTrait、CustomerTrait{
    字符串getName(){…}
    字符串getAddress(){…}
    }
    def internalCustomer=新的internalCustomer()
    println internalCustomer.id//1000
    println internalCustomer.company//Internal
    

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

    你不能:@LA_389;:一个类可以实现多个接口,但只扩展一个类,因此你可以使用所有接口实现你的类,而无需将所有接口合并到一个接口中。一旦你创建了AbstractBillingActivity和PreferenceActivity作为接口,您不需要创建另一个名为BillingInterface的接口。相反,请使用以下代码:公共类首选项实现AbstractBillingActivity,PreferenceActivity那么我应该如何将AbstractBillingActivity()与首选项一起使用?我不知道。乍一看,想要同时扩展名为
    首选项
    计费活动
    的东西是没有意义的-我看不到这两者之间有任何联系。如果您的首选项需要存储计费活动,请使用合成,反之亦然。我在哪里可以阅读有关合成的内容?这对我来说是新鲜事。或者,你能举个例子吗?非常感谢。只是有一个对象作为另一个对象的成员。请检查我的问题,upd2?我以前从未使用过接口。用这种方法我们真的能达到上述目标吗?如果很高兴知道的话我有一个问题要问你。。我认为java中存在多重继承。让我来解释一下A类B类。A类扩展了B类和B类
    class Phone {
    DeviceInfo info;
    String phoneNumber;
    Stryng phoneType;
    //sets; gets
    }