【问题标题】:Can one class extend two classes?一个类可以扩展两个类吗?
【发布时间】:2011-09-29 01:54:35
【问题描述】:

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

public class Preferences extends AbstractBillingActivity {

public class Preferences extends PreferenceActivity {

怎么做?

更新。既然这是不可能的,那我应该如何使用带有 Preferences 的 AbstractBillingActivity 呢?

更新2。如果我使用接口,我应该创建:

  1. 计费接口

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

    public interface PreferenceActivity {
    
    }
    
  3. AbstractBillingActivity

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

然后

public class Preferences implements BillingInterface {

【问题讨论】:

  • @LA_:一个类可以实现多个接口,但只能扩展一个类,因此如果需要,您可以使用所有接口实现您的类,而无需将所有接口合并到一个接口中。
  • 将 AbstractBillingActivity 和 PreferenceActivity 创建为接口后,您无需创建另一个名为 BillingInterface 的接口。而是使用此代码: public class Preferences implements AbstractBillingActivity,PreferenceActivity

标签: java android multiple-inheritance


【解决方案1】:

Java 不支持多重继承。

我能想到一些解决方法:

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

二是使用接口。

第三个是重新思考你的设计:Preferences 类既是 PreferenceActivity 又是 AbstractBillingActivity 有意义吗?

【讨论】:

  • 接口不起作用,因为它们是接口......它们只支持公共方法。请参阅此处讨论的问题:stackoverflow.com/questions/5376970/protected-in-interfaces
  • 老实说,当近 10 年前被问到这个问题时,这个问题已经够模糊了,以至于当时建议使用接口是有意义的。但即使在今天,我仍然不明白为什么接口不起作用,或者更确切地说,为什么你绝对需要在这里使用受保护的方法。
【解决方案2】:

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

【讨论】:

  • 我应该如何使用带有 Preferences 的 AbstractBillingActivity (github.com/robotmedia/AndroidBillingLibrary)?
  • 我不知道。乍一看,想要扩展名为 PreferencesBillingActivity 的东西是没有意义的——我看不出这两者之间有任何联系。如果您的偏好需要存储计费活动事物,请使用组合,反之亦然。
  • 在哪里可以阅读有关作文的信息?这对我来说是新事物。或者,你能发布一个例子吗?谢谢。
  • Composition 只是将一个对象作为另一个对象的成员。
【解决方案3】:

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

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

【讨论】:

  • 我们真的可以用这种方法实现上述目标吗?如果很高兴知道的话。
【解决方案4】:

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

【讨论】:

  • 我有一个问题要问你。我认为java中存在多重继承。让我解释一下 A 类 B 类。A 类扩展了 B 类,A 类也扩展了对象类。那么我们怎么能说java不支持多重继承..
【解决方案5】:

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

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

【讨论】:

  • 你能检查我的问题吗,upd2?我以前从未使用过接口。
【解决方案6】:

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

此外,在 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

【讨论】:

  • 附录:我收回这个答案:我已经知道如果你需要类似于多重继承的行为,“对象组合”可能是你想要使用的。此外,实现多个接口不会像多重继承:您不能有一个实现两个接口的类,而这两个接口都包含具有相同签名的默认方法,除非该类本身为该方法提供了实现;因此我们仍然有效地拥有单一继承。一直在学习...
【解决方案7】:

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

public class MyClass extends JMenuItem {


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

}

【讨论】:

    【解决方案8】:

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

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

    【讨论】:

    • 接口(实现)与继承(扩展)无关。
    【解决方案9】:

    熟悉多级层次结构?

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

    你可以试试这个。

    public class PreferenceActivity extends AbstractBillingActivity {}
    

    然后

    public class Preferences extends PreferenceActivity {}
    

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

    【讨论】:

      【解决方案10】:

      如果您要扩展的类仅包含方法,我可以想到一种解决方法。

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

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

      【讨论】:

        【解决方案11】:

        此外,您可以将 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;
        String phoneType;
        //sets; gets
        }
        

        【讨论】:

          【解决方案12】:

          如果您对使用来自多个类的方法感兴趣,最好的方法是使用组合而不是继承

          【讨论】:

          • 您好,欢迎来到 SO!请添加一些代码或示例,以便其他人能够很好地理解。
          【解决方案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
          
          

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

          【讨论】:

            猜你喜欢
            • 2011-09-27
            • 1970-01-01
            • 2017-07-09
            • 1970-01-01
            • 2010-10-13
            • 1970-01-01
            • 2012-09-30
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多