【问题标题】:Bypass multiple inheritance in Java绕过Java中的多重继承
【发布时间】:2012-01-31 15:06:53
【问题描述】:

我认为我的继承问题有解决方案,但我找不到。

我正在开发一个 Android 应用程序(目标是 Android 2.1),它在大多数页面上重复使用 SlidingDrawer(用于我的菜单)。为了避免在所有 Activity 上初始化它,我创建了一个 DefaultActivity 来这样做。在我不得不扩展 TabActivity 之前它运行良好,因为 Java 不支持多重继承。

基本上我有以下默认活动

public class DefaultActivity extends Activity{ 
    // Declarations

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Some code
    }

    @Override
    protected void onPause() {
        // Some code
    }

    protected void initializeMenu() {
        // Init
    }
}

现在,当我有活动时,我会执行以下操作

public class SomeActivity extends DefaultActivity{ 
    // Declarations

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.myLayout);
        super.initializeMenu();
    }
}

但我有一个扩展 TabActivity 的视图,所以我不能这样做

public class SomeOtherActivity extends TabActivity, DefaultActivity

我怎样才能只扩展一个类但其中包含 ActivityTabActivity 的代码?

谢谢。

【问题讨论】:

  • 您的目标是什么操作系统?这可以通过在 OS 3+ 中使用片段来解决

标签: java android multiple-inheritance


【解决方案1】:

我会为 DefaultActivity 使用组合而不是继承。

创建一个 ActivityHelper 类,它可以完成 DefaultActivty 所做的一切。那么你的活动都有一个 ActivityHelper 类型的成员变量。

  public class ActivityHelper { 
  // Declarations

  @Override
   public boolean onCreateOptionsMenu(Activity activity, Menu menu) {
    // Some code
  }

  @Override
  protected void onPause(activity) {
    // Some code
   }

   protected void initializeMenu(activity) {
    // Init


   }
}

public class MyActivity extends Activity { 
  private final ActivityHelper helper;

  @Override
   public boolean onCreateOptionsMenu(Menu menu) {
    helper.onCreateOptionsMenu(this, menu)
  }

  @Override
  protected void onPause() {
    helper.onPause(this);
  }

   protected void initializeMenu() {
     helper.initializeMenu(this)
   }
}

代码有点多,但更灵活。这仅在您的 DefaultActivity 不依赖 Activity 中的受保护方法时才有效。

【讨论】:

  • 谢谢,我想过做这样的事情,但我找不到合适的方法!
【解决方案2】:

标签活动。

此类已弃用。 新的应用程序应该使用 Fragments 而不是这个类;要继续在旧设备上运行,您可以使用 v4 支持库,它提供了向下兼容 DONUT 的 Fragment API 版本。

【讨论】:

  • 是的,我知道选项卡活动已被弃用,但我在没有选项卡的情况下使用它。我用按钮模拟它的功能。我只是希望能够不重新加载所有活动,而只是在这种特定情况下的内容。我的问题是关于多重继承而不是应用程序本身的设计。
【解决方案3】:

将 TabActivity 作为数据成员而不是对其进行扩展,并将您不想覆盖的每个方法委托给它,其他方法自己实现。 这不会解决问题,很难,该方法同时存在于 DefaultActivity 和 TabActivity 中(我猜有一堆......)。 这就是Java不允许多重继承的原因:)

希望对你有帮助。

【讨论】:

    【解决方案4】:

    通常在一般编程中,我们会添加该对象的一个​​字段以使用多重继承

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-17
      • 1970-01-01
      • 2014-03-16
      • 2015-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-06
      相关资源
      最近更新 更多