抽象类去除活动中的冗余代码

我创建了一个抽象类来防止我的每个活动中出现冗余代码。

public abstract class MyGeneralizedActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); } @Override public void attachBaseContext(Context newBase) { super.attachBaseContext(CalligraphyContextWrapper.wrap(newBase)); } //... } 

这样做我完全没问题:

 public class MyActivity extends MyGeneralizedActivity{...} 

但现在我已经到了必须从FragmentActivity扩展MyActivity 。 这意味着我不能再从MyGeneralizedActivity扩展。

现在我想知道是否可以设置一个通用的抽象结构来扩展我的所有活动。

编辑
只是通过从FragmentActivity扩展MyGeneralizedActivity不会解决我的问题。 例如TabActivity会导致同样的问题。

UPDATE
对于那些可能有兴趣在Android中解决同样问题的人,我找到了一个简单的解决方法。 存在Application类,其中提供了ActivityLifecycleCallbacks接口等。 它完全符合我的需要,允许我们拦截并为所有活动的重要事件添加一些价值。

您所要做的就是扩展Android Application类并创建一个实现ActivityLifecycleCallbacks的私有类。
不要忘记在AndroidManifests文件中添加/重命名您的应用程序:

  

由于FragmentActivityMyGeneralizedActivity都是类而不是接口,因此无法创建属于两者的子类型的类型。

Java将您限制为单inheritance,因此如果您依赖于共享实现(包含在两个类中),那么您最好的选择是依赖于组合。

例如:

 public class MyActivity extends Activity { FragmentActivity fragmentActivity; MyGeneralizedActivity myGeneralizedActivity; public MyActivity(FragmentActivity fragmentActivity, MyGeneralizedActivity myGeneralizedActivity) { this.fragmentActivity = fragmentActivity; this.myGeneralizedActivity = myGeneralizedActivity; } @Override protected void onCreate(Bundle savedInstanceState) { this.fragmentActivity.onCreate(savedInstanceState); this.myGeneralizedActivity.onCreate(savedInstanceState); //... } @Overridepublic void attachBaseContext(Context newBase) { this.fragmentActivity.attachBaseContext(CalligraphyContextWrapper.wrap(newBase)); this.myGeneralizedActivity.attachBaseContext(CalligraphyContextWrapper.wrap(newBase)); //... } } 

这似乎是装饰器模式的一个问题。

意图

  • 动态地将附加职责附加到对象。 装饰器为子类化提供了灵活的替代扩展function。
  • 通过递归包装客户端指定的核心对象的装饰。
  • 包装礼物,将其放入盒子中,然后包装盒子。

问题

您希望在运行时向各个对象添加行为或状态。 inheritance是不可行的,因为它是静态的并且适用于整个类。

结构体

规范forms: 装饰图案图

特别考虑你的情况,因为Android API没有为Activity定义一个接口,我们可以跳过一些官僚主义,只是以(不是那么)快速和肮脏的方式来做:

 abstract public class ActivityDecorator extends Activity { protected Activity original; public MyAcitvityDecorator(Activity original) { this.original = original; } protected void onCreate(Bundle savedInstanceState) { this.original.onCreate(savedInstanceState); } /* ... Because there is no better way of doing it in Java, you should do * this for every method in the Activity class: delegate the execution of * the method to the original activity object. * Yes, there is A LOT of methods! } 

然后你必须创建一个具体的装饰器并覆盖到期方法:

 class MyActivityDecorator extends ActivityDecorator { @Override protected void onCreate(Bundle savedInstanceState) { this.original.onCreate(savedInstanceState); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); } @Override public void attachBaseContext(Context newBase) { this.original.attachBaseContext(CalligraphyContextWrapper.wrap(newBase)); } } 

然后你可以像这样使用它:

 Activity myActivity = new MyActivityDecorator(new Activity()); 

因为MyAcitvityDecoratorActivity一个实例,所以你可以无缝地传递它。

您甚至可以链接装饰器并更改原始的Activity对象,如下所示:

 Activity myActivity = new MyActivityDecorator( new AnotherActivityDecorator( new TabActivity() ) ); 

请参阅FragmentActivity源代码 。 FragmentActivity扩展了Activity类。 我想你应该试试看。

祝你好运。

如果使用Java 8,则可以使用默认方法创建接口。然后,您可以通过这种方式实现多个接口并获得所需的结果。

请参阅详细信息: 使用默认方法的接口与Java 8中的Abstract类