【问题标题】:How to "map" two different object inheritance trees without instanceof如何在没有 instanceof 的情况下“映射”两个不同的对象继承树
【发布时间】:2021-11-13 17:40:03
【问题描述】:

我有一个设计问题,我无法找到好的解决方案。这是我的问题:

有两个不同的对象“树”需要一起处理。对象树一:

  • AbstractObjectTreeOneSub1ObjectTreeOneSub2ObjectTreeOne
  • AbstractObjectTreeTwoSub1ObjectTreeTwoSub2ObjectTreeTwo

我现在有一个方法可以获取 AbstractObjectTreeOne 列表和 AbstractObjectTreeTwo 列表。它们的大小完全相同,并且按名称彼此“匹配”。所以我可以遍历 AbstractObjectTreeOne 列表中的对象并按名称获取相应的 AbstractObjectTreeTwo。

现在应该验证“匹配”对象(按名称)是否真的相互匹配,因此当前代码包含很多 instanceof 内容。示例:

if (!(objectOfAbstractObjectTreeOne instanceof Sub1ObjectTreeOne)) {
   throw exception;
}

然后也用同样的方法

if (!(objectOfAbstractObjectTreeTwo instanceof Sub1ObjectTreeTwo)) {
   throw exception;
}

之后,这两个参数都被转换为它们的“真实”子类型以进行进一步处理。这也感觉不是很好。

这一切都感觉不是很面向对象,但我目前不知道如何解决这个问题。我尝试了访问者模式,但它只解决了 AbstractObjectTreeOne 或 AbstractObjectTreeTwo 中的 instanceof 问题,并且仍然包含很多 instanceof。

也许你们中的一些人对这类问题有一个好主意。也许这很容易解决,但我还没有正确的想法。

【问题讨论】:

  • 运营商是instanceof,而不是instanceOf

标签: java oop design-patterns


【解决方案1】:

这叫做OOO原理Polymorfism

无需使用instanceof。您必须创建一个interface 并在树的声明中使用它。所有子类型都应该实现这个接口,你可以调用需要的方法而不需要类型转换。

这是一个例子。

public interface ObjectTreeOne { void payloadOne() {}   }
public class Sub1ObjectTreeOne implements ObjectTreeOne {   void payloadOne() {}    }
public class Sub2ObjectTreeOne implements ObjectTreeOne {   void payloadOne() {}    }

List<ObjectTreeOne> objectTreeOne = new ArrayList<>();
objectTreeOne.add(new Sub1ObjectTreeOne()); 
objectTreeOne.add(new Sub2ObjectTreeOne());

public interface ObjectTreeTwo {    void payloadTwo() {}    }
public class Sub1ObjectTreeTwo implements ObjectTreeTwo {   void payloadTwo() {}    }
public class Sub2ObjectTreeTwo implements ObjectTreeTwo {   void payloadTwo() {}    }

List<ObjectTreeTwo> objectTreeTwo = new ArrayList<>();
objectTreeTwo.add(new Sub1ObjectTreeTwo()); 
objectTreeTwo.add(new Sub2ObjectTreeTwo());

for(int i = 0; i < 2; i++) {
    ObjectTreeOne objectTreeOne = objectTreeOne.get(i);
    ObjectTreeTwo objectTreeTwo = objectTreeTwo.get(i);
    
    objectTreeOne.payloadOne();
    objectTreeTwo.payloadTwo();
    
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-09
    • 2012-02-20
    • 2016-09-21
    • 2015-05-17
    • 2022-08-02
    • 1970-01-01
    • 2015-11-25
    相关资源
    最近更新 更多