Java缺乏模板继承导致Android中的主要代码重复问题.有解决方案吗

Pau*_*ean 6 java android multiple-inheritance

这是Android特定的.

我从一个自定义类派生我在Android中的所有活动,它提供了一个漂亮,干净的地方,可以放置应用程序中所有布局使用的公共代码,特别是一些常见的setContentView()覆盖代码,它将布局注入到我的布局中.所以这是典型的层次结构:

MyActivity extends MyBaseClass -> MyBaseClass extends Activity -> Activity
Run Code Online (Sandbox Code Playgroud)

对于我的某个应用,我需要Google地图支持.所以我试图将MyBaseClass转换为模板/泛型,以便我可以做类似的事情:

MyActivity extends MyBaseClass<MapActivity> -> MyBaseClass<T> extends T -> T
Run Code Online (Sandbox Code Playgroud)

当然,这无法编译,因为Java模板/泛型并不像我在尝试后不久发现的C++模板那样有用.所以我最终创建了一个完整的单独的类作为临时解决方法:

MyActivity extends MyBaseMapClass -> MyBaseMapClass extends MapActivity -> MapActivity
Run Code Online (Sandbox Code Playgroud)

并将MyBaseClass中的所有代码复制到MyBaseMapClass中.除了涉及进口的一些小改动之外,代码是相同的.它有效,但它不是一个好的解决方案.

我越过我的手指,上面将是问题的结束,我将永远不必再次重访它.

不幸的是,我开始尝试使用一个更复杂的基类的片段和活动组合,并且上面的代码重复问题变成了一个严重的问题.每当我在一个文件中进行更改时,我必须记住将其克隆到其他文件,并且开发速度足够快,以至于我很快就会失去同步.

Activity,MapActivity,FragmentActivity,ListActivity,PreferenceActivity等.我是否需要为我想要使用的每一个创建一个单独的派生类?我希望不会,因为这个原因,我已经开始限制我的推导(我的一些活动因此没有某些特征).我有时会使用两个独立的基类(其中一些活动需要将更多视图扩展到布局中,但并非所有活动都需要这样做),这进一步加剧了这个问题:

MyActivity extends MyBaseClass -> MyBaseClass extends Activity -> Activity

MyActivity2 extends AnotherBaseClass -> AnotherBaseClass extends MyBaseClass -> MyBaseClass extends Activity -> Activity
Run Code Online (Sandbox Code Playgroud)

If I want to use the code for AnotherBaseClass in Maps, I not only have to create MyBaseMapClass, but also AnotherBaseMapClass and copy the code. I'm up to four classes at this point where two of the classes are a couple thousand lines of cloned code. Replicated code bothers me because it makes maintenance and development that much harder to do.

Deriving Android classes introduces complexities such as findViewById() being a part of the Activity base class. That's important because I'm not sure how I would write an interface or composite without running into the same problems I just described.

Anyone here encountered this issue and come up with a workable solution?

Sim*_*ays 2

为什么不创建一个带有静态函数的帮助器类,例如styleActivity(Activity a)?在这种情况下,这似乎是比使用继承更简单的解决方案。