我希望在各种活动中分享方法和属性。 E.g。
public class BaseActivity extends Activity
将成为另一项活动的父级
public class MainActivity extends BaseActivity
但是,如果儿童活动是例如ListActivity这是不可能的,对吧?我也需要ListActivity的基类吗?这将是冗余代码。
我可以将ListActivity转换为Activity,但这需要更多代码。
有什么建议吗?
答案 0 :(得分:5)
是的,你是对的。由于java不支持多重继承,因此一个类只能有一个基类。
但您可以通过委派而不是继承来工作:将您的方法放入一个单独的类(不继承Activity
)并在您的活动中使用它的实例。然后,您可以将冗余代码(创建和保存实例)减少到最小。
另见:
http://sourcemaking.com/refactoring/replace-inheritance-with-delegation
答案 1 :(得分:4)
对于ListActivity
案例,我会创建一个BaseListActivity
,其范围为BaseActivity
。 BaseListActivity
将包含getListView()
,如果您真的需要它,则会返回ListView
,受保护的方法setAdapter()
会收到Adapter
/ {{1 }}。您还可以创建一些受保护的方法,以便显示空视图,启用此行为并返回空视图和ListView的ID。默认情况下,这些应指向ListAdapter
/ android.R.id.list
。但是你可以在你的孩子活动中覆盖它。
最后,这是一个OOP的问题,而不是特定的Android。如果您检查ListActivity的实施情况,您会发现实施自己的android.R.id.empty
是多么简单。最后,拥有一致且强大的类层次结构更为重要。
答案 2 :(得分:1)
我正在以这种方式使用Activities
,我很高兴我正在这样做。当然你必须做一些改变(比如你在问题中提到的ListActivity
),但是在我看来它有更多优点,然后是不利的。
在我的应用中,我不必担心每次创建新Activity
时都会发送Google Analytics数据,而且我也不必担心我需要设置BroadcastReceiver
每个班级,我只是制作了我的BaseActivity
摘要,并且每当我BaseActivity
获得广播时,我都会调用一个抽象函数。
答案 3 :(得分:0)
如果你想分享一些方法,那就是实现接口的最佳方法,或者为baseactivity制作一个抽象类。
答案 4 :(得分:0)
正如其他人所指出的那样,你需要使用组合,因为在Java中不可能有多重继承。这个answer相关问题解释了如何在Android活动中执行此操作。