【问题标题】:JAVA avoid duplicate code when casting to sibling classesJAVA在转换为兄弟类时避免重复代码
【发布时间】:2016-02-16 09:38:46
【问题描述】:

我有 2 个 Java 类 A 和 B;它们都扩展了另一个 Java 类,例如 C。在另一个类中,我有一个 C 类的对象,作为方法的参数传递,我必须使用这个对象(具有适当的强制转换)来设置 A 和 B 的字段,例如:

if(C instanceof A){
    ((A)C).setAField1(AField1);
    ...
    ((A)C).setAFieldN(AFieldN);
}else if (C instanceof B){
    ((B)C).setBField1(BField1);
    ...
    ((B)C).setBFieldN(BFieldN);
}

我必须设置相同的字段,我对 setter 方法有相同的调用,但我必须进行不同的强制转换。我该怎么做才能避免代码重复?

PS:我不能将这些字段放在 C 类中,因为它是由不需要它们的其他类扩展的。

【问题讨论】:

    标签: java inheritance code-duplication


    【解决方案1】:

    编程到接口。

    让你所有的类通过一个接口实现,然后使用接口类型改变。

    你最终得到如下代码,没有 if 条件

     yourInterfaceInstance.setField(fieldVar);
    

    【讨论】:

    • 不使用接口代码重复是唯一的办法吗?
    【解决方案2】:

    您可以将您的方法拆分为其他 2 种方法,一种接受 A 类的对象,另一种接受 B 类的对象。如果您需要太多向下转换,可能将对象作为 C 传递是不合适的。如果您为 A 类方法(interfaceA)定义接口,为 B 类集合方法(比如 InterfaceB)定义一个接口,那应该会很棒。因此,在您的新方法中,您可以通过接口传递对象,并且您的代码将是可扩展的。例如:

    void methodThatWorkWithA(InterfaceA obj) {
      obj.setFieldA1(someValue);
    }
    

    B 类也一样。

    【讨论】:

      【解决方案3】:

      你可以使用接口的概念。

      A 类扩展 C{}

      B 类扩展 C {}

      C 类实现 StackOverFlow {}

      界面 StackOverFlow{ }

      类测试{

      // StackOverFlow.setField(field); }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-04-23
        • 2023-03-22
        • 2018-04-05
        • 2014-03-07
        • 1970-01-01
        相关资源
        最近更新 更多