【问题标题】:Multiple super classes and code reuse多个超类和代码重用
【发布时间】:2013-03-12 04:02:43
【问题描述】:

这个问题与 Android 有关,因为我的需求存在于那个领域,但这个问题仍然适用于整个 Java;我将在这里使用一些 Android 术语,例如ActivityFragmentActivityListActivity 等...

我需要实现一个包含必须在整个应用程序中使用的功能的抽象基类,更具体地说,每个Activity 都必须使用此功能,但我希望它由基类自动处理。我的问题是我在应用程序中有许多不同类型的活动,例如ActivityFragmentActivityListActivity,所有这些都扩展了Activity(当然减去Activity)。

由于基类中的代码对于Activity 的每个实现都是完全相同的,有没有办法避免代码重复并需要为Activity 的每种类型创建一个基类?

我要避免的事情:

public abstract class BaseActivity extends Activity
{
    public void onCreate(Bundle savedBundle)
    {
        // code goes here, will be the exact same for all these base classes
    }
}

public abstract class BaseFragmentActivity extends FragmentActivity
{
    public void onCreate(Bundle savedBundle)
    {
        // code goes here, will be the exact same for all these base classes
    }
}

public abstract class BaseListActivity extends ListActivity
{
    public void onCreate(Bundle savedBundle)
    {
        // code goes here, will be the exact same for all these base classes
    }
}

public class MyMainActivity extends BaseActivity
{
}

public class MyUserList extends BaseListActivity
{
}

public class SomeActivityThatNeedsToBeAFragment extends BaseFragmentActivity
{
}

我试图通过使用类似下面的东西来利用泛型

public abstract class BaseActivity<T extends Activity> extends T

但显然这行不通;或者我只是做错了。那么有什么方法可以实现这种代码重用并避免重复,还是我只是简单地重复我的代码?

谢谢!

【问题讨论】:

  • 我遇到了同样的问题,我所做的是,我只有一个扩展 FragmentActivity 的基本活动,我在需要其他功能时使用片段,但我仍然可以在 FragmentActivity 中创建列表视图
  • 是否可以简单地将所有这些 onCreate 方法中的通用代码移动到一个实用程序类中,并让它们调用它?
  • @DavidConrad 是的,这是可能的,并且类似于G. Blake Meike 答案的选项 2,但即使这样也有一定程度的代码重复,因为我必须在每个每个 Activity 都使用这个实用程序类,这会带来一系列问题,比如确保开发人员记得使用这个实用程序类,希望一个或两个 Activity 不会从裂缝中溜走并向用户呈现不稳定的行为。
  • 开发人员只需要记住扩展适当的基类,不是吗? public class ZooListActivity extends BaseListActivity。当然,即使 Java 有多重继承,开发人员仍然需要记住扩展 BaseListActivity 而不是 ListActivity,对吧?
  • @DavidConrad 不,我明白你的意思,在我的例子中,它只是 onCreate 中的一行,但实际上我的代码需要 1 行代码用于(当前)5 种方法,我需要为我需要的每种类型的 Activity 复制 BaseListActivity 所以基本上我会有一个扩展 Activity 的基类,一个扩展 ListActivity 的基类,一个扩展 FragmentActivity 的基类,依此类推,我需要的每一个......所有这些都会在实用程序类中调用方法的行几乎是彼此完全相同的副本。

标签: java android inheritance


【解决方案1】:

通常,使用 Fragments 可以帮助解决此类问题。在您的特定情况下,尽管我看到您也想使用 ListActivity。那就更难了

如您所知,Java 在这里帮不了您。您不能继承多个实现(List 和 MyBase)。没有简单的答案。我可以建议两件事:

  • List(Activity,Fragment) 是对其基类的非常简单的扩展。您可以通过合理的工作量构建自己的,从您的基类继承。它们可能比框架中的更简单。或许这样就好了。

  • 委托。编写一个实现常见行为但不从 Activity/Fragment 继承的类。在片段/活动类的初始化期间创建这些对象之一。只要有共同行为,就将其委托给委托实例。

【讨论】:

  • +1 以获得良好的响应。不幸的是,我确实在各种活动类中使用了复杂的功能,因此选项 1 不可用。选项 2 会起作用,但我试图避免必须实例化并保留对这个自定义类的引用,并在我最终创建的每个活动中“挂钩”所有内容;这就是为什么我想要一个具有所需功能的基类并从中扩展,所以它只是“神奇地”得到照顾。看起来可能最终只需要处理代码重复;选项 2 中也有一些代码重复,以及委托。
  • 是的,我知道你要一次又一次地编写委托代码是什么意思。呸!那么,如何进行综合:继续编写 4 个超类——基于香草和列表的 Activity/Fragment 版本——并让它们代理复杂功能的实现。你知道你必须这样做...... ;-)
  • @g-blake-meike 恐怕这就是我最终要做的事情DavidConrad,我在问题的 cmets 中讨论了那个确切的事情。我将接受您的回答,因为您提供的第二个选项将被使用,除了委托将发生在您上面所说的超类中。
【解决方案2】:

创建一个名为BaseActivity 的抽象类。为它实现onCreate(),它应该涵盖活动操作的基础知识。创建从BaseActivity 扩展的其他类,并允许它们覆盖该方法,当且仅当它们做的事情比BaseActivity 稍微特别一些。

这里的主要思想是,无论您拥有或创建的任何Activity 都以某种方式相互关联,它们执行类似的代码操作。只有在特殊情况下,您才需要做一些额外的事情,因此会覆盖 onCreate()

【讨论】:

  • 我确实需要在 onCreate 中做一些特别的事情,这就是为什么我要创建一个扩展 Activity 的类来覆盖该方法,但在 Android 中你需要让你的“可显示”类扩展一个表单的 Activity 但还有其他东西已经扩展了 Activity。例如:FragmentActivity 扩展了 Activity 并提供了自己的特殊功能,我需要这个功能,但我还需要基类中的功能,所以如果基类扩展 Activity,它将丢失所有 FragmentActivity 功能。
猜你喜欢
  • 1970-01-01
  • 2013-09-12
  • 1970-01-01
  • 2014-08-28
  • 2016-05-27
  • 2013-02-13
  • 2019-10-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多