同一Java类的两个版本,每个版本都有不同的超类

时间:2014-04-29 18:08:15

标签: java android oop dry

Java中最简洁的方法是编写同一个类的两个版本,每个版本都有不同的超类?最干净的我的意思是DRY(最不重复的代码)。这两个类将具有相似但不同的名称和相同的代码。

应用程序是Android:class MyActivity扩展了ActionBarActivity。类MyActivity34(对于API级别3/4)扩展了Activity,但具有与MyActivity相同的代码。我不想保留所有内容的两个副本(在C ++中我会使用预处理器)。更改超类不是一种选择。

感谢。

注意:ActionBarActivity类不能在API级别3或4(运行时错误)中使用,因此MyActivity34无法在继承路径中的任何位置使用它。

2 个答案:

答案 0 :(得分:1)

我可能会说最好的办法就是使用合成来封装任何重复的代码。创建一个包含所有共享代码的类,并从MyActivity和MyActivity34类中调用它。组合通常比奇怪的继承结构更好/更清洁。

答案 1 :(得分:0)

使用所有方法创建一个界面,例如MyCommonActivityInterface

public interface MyCommonActivityInterface {
    public void sayHello();
    public void sayGoodbye();
}

使用所有代码

创建一个公共活动
public class MyCommonActivity implements MyCommonActivityInterface {
    ...
    public void sayHello() {Log.d("MyCommonActivity", "says hello")};
    public void sayGoodbye() {Log.d("MyCommonActivity", "says goodbye")};
    ...
}

现在,您可以重复使用两个活动中的公共代码

public class MyActivity34 extends Activity {
    MyCommonActivityInterface common = new MyCommonActivity();
    public void sayHello() {common.sayHello()};
    public void sayGoodbye() {common.sayGoodbye()};
}

public class MyActivity extends ActionBarActivity {
    MyCommonActivityInterface common = new MyCommonActivity();
    public void sayHello() {common.sayHello()};
    public void sayGoodbye() {common.sayGoodbye()};
}

实际上,界面可以省略,但如果你需要在替代品之间进行交换等,它会派上用场。

我对依赖注入的力量印象深刻,这可以使这些事情变得更加清洁。

有一个名为Dagger的库,它为Android添加了DI支持。它有一个有点陡峭的学习曲线,但对我来说这一切都是值得的。

在这个示例中,您可以执行以下操作:

@Singleton
public class MyCommonActivity  {

    // Example with context to show that it will be automagically injected

    @Inject
    public MyCommonActivity(@ForActivity Context context) {}
    ...
    public void sayHello() {Log.d("MyCommonActivity", "says hello")};
    public void sayGoodbye() {Log.d("MyCommonActivity", "says goodbye")};
    ...
}

public class MyActivity34 extends Activity {

    @Inject MyCommonActivity common;

    public void sayHello() {common.sayHello()};
    public void sayGoodbye() {common.sayGoodbye()};
}

public class MyActivity extends ActionBarActivity {

    @Inject MyCommonActivity common;

    public void sayHello() {common.sayHello()};
    public void sayGoodbye() {common.sayGoodbye()};
}

有很多独立的代码类,其中一些依赖于其他代码,或者需要一个Context对象等,只需在需要的时候和地点添加@Inject行就可以节省很多代码行!

虽然我们添加它,看看ButterKnife,更简单,但也只适用于注入视图。仍然相当强大和整洁。