samedi 13 novembre 2021

How to "map" two different object inheritance trees without instanceof

I have a design question I can't get a good solution for. This is my problem:

There are two different object "trees" which need to processed together. Object tree one:

  • AbstractObjectTreeOne with Sub1ObjectTreeOne and Sub2ObjectTreeOne
  • AbstractObjectTreeTwo with Sub1ObjectTreeTwo and Sub2ObjectTreeTwo

I now have a method where I get a list of AbstractObjectTreeOne and a list of AbstractObjectTreeTwo. They are exact the same size and "match" to each other by name. So I can loop through the objects in the list of AbstractObjectTreeOne and get the according AbstractObjectTreeTwo by name.

Now it should be validated if the "matching" objects (by name) really match to each other, so the current code contains a lot of instanceof stuff. Example:

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

and then also in the same method

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

After that, both parameters are cast to their "real" subtype to be further processed. This also does not feel very good.

This all feels not very object-oriented, but I currently do not have a good idea how to solve this. I tried the visitor pattern, but it only solves the instanceof issue in either AbstractObjectTreeOne or AbstractObjectTreeTwo and still contains a lot of instanceof.

Maybe some of you have a good idea about this kind of problem. Maybe it's easy to solve, but I do not have the right idea yet.

Aucun commentaire:

Enregistrer un commentaire