多重继承和代码复用

11
这个问题与Android相关,因为我的需求存在于这个领域,但这个问题仍然适用于整个Java语言;我将在这里使用一些Android术语,例如ActivityFragmentActivityListActivity等。
我需要实现一个抽象基类,其中包含必须在整个应用程序中使用的功能,更具体地说,每个Activity都必须使用此功能,但我希望它由基类自动处理。我的问题是,在应用程序中有许多不同类型的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中创建列表视图。 - Yasitha Waduge
是否可以将所有onCreate方法中通用的代码移动到一个实用类中,并让它们调用它? - David Conrad
1
@DavidConrad 不,我明白你的意思,在我的例子中只有一个onCreate中的一行代码,但实际上我的代码需要1行代码来处理(目前)5个方法,并且我需要为每种类型的Activity复制BaseListActivity,因此基本上我将拥有一个扩展Activity的基类,一个扩展ListActivity的基类,一个扩展FragmentActivity的基类等等,对于我需要的每一个都是几乎完全相同的副本,其中包含调用实用程序类内部方法的行。 - vane
@DavidConrad 我可以看出来这对于代码管理是有用的,如果需要更改某些内容;使用这种方法,我只需要更改实用类中的方法而不是 5 个相同的基类,但是如果我添加一个方法,那么我需要回去并将相应的方法添加到每个基类中,再次复制代码。我并不是说你的解决方案是错误的,事实上可能是我最终使用的方法,但它没有解决问题,即代码重复...问题可能无法在 Java 的限制范围内解决。 - vane
我同意,在Java中可能没有更好的解决方案。 - David Conrad
显示剩余4条评论
2个回答

3
经常使用Fragments可以帮助解决这种问题。在您的特定情况下,尽管我看到您也想使用ListActivity,但这使问题更加复杂。
如您所知,Java无法帮助您。您不能继承多个实现(List和MyBase)。 这没有简单的答案。 我可以提出两件事:
1. List(Activity, Fragment)是其基类的相当简单的扩展。您可以通过合理的工作量构建自己的扩展,并从您的基类继承它们。 它们可能比框架中的更简单。也许那样就可以了。
2. 委托。编写一个实现公共行为但不继承自Activity / Fragment的类。 在初始化Fragment / Activity类时创建其中一个对象。 任何时候都有公共行为时,都将其委托给委托实例即可。

很遗憾,我在各种活动类中使用了复杂的功能,因此选项1不可行。选项2可以工作,但我试图避免实例化并保留对此自定义类的引用,并在创建每个活动时“挂钩”所有内容;这就是为什么我想要一个具有所需功能并从中扩展的基类,以便它只是“神奇地”被处理。看起来我最终可能还是不得不处理代码重复;选项2也有一些委托的代码重复。 - vane
是的,我知道你所说的反复编写委托代码的感受。唉!那么,怎么样综合一下:继续编写4个超类——基于vanilla和list的Activity/Fragment版本——并让它们将委托工作交给实现复杂功能的部分。你知道你必须这样做...;-) - G. Blake Meike
@g-blake-meike,恐怕我最终会这样做。DavidConrad和我在问题的评论中讨论了这个问题。我将接受您的答案,因为您提供的第二个选项是将要使用的选项,但例外情况是委托将发生在超类中,就像您上面所说的那样。 - vane

0
创建一个名为BaseActivity的抽象类。实现其onCreate()方法,该方法应覆盖活动操作的基础知识。创建其他从BaseActivity继承的类,并允许它们仅在执行比BaseActivity更特殊的操作时覆盖该方法。
主要思想是无论您拥有或创建了哪个Activity,它们都以某种方式相互关联,执行类似的代码操作。只有在特殊情况下,您才需要执行额外的操作,因此需要重写onCreate()方法。

我需要在onCreate中做一些特殊的事情,这就是为什么我正在创建一个扩展Activity以覆盖该方法的类。但在Android中,您需要让您的“可显示”类扩展Activity的某种形式,但还有其他已经扩展了Activity的东西。例如:FragmentActivity扩展了Activity并提供了自己的特殊功能,我需要这个功能,但我也需要在基类中使用我的功能,因此如果基类扩展Activity,则会缺少所有FragmentActivity功能。 - vane

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接