We have a tree of objects of different types derive from a common tree node and We want to write a method to render complete tree. We are using different renderer based on UI selected Eg.. text Renderer, 2d renderer, 3d renderer. Our tree is our model and we don't want to put in rendering code inside it. so, we decided to create separate rendering code. Our renderer have a method RenderNode(TreeNode node) that takes reference of base class TreeNode. Since, we need to work with various different kind of node, we are type checking for each tree node type and rendering it.
void RenderNode(TreeNode node) {
if(node is NoEditNode){
// call Derive class RenderEditNode
RenderEditNode(node);
}
else if (node is PersonNode){
// call Derive class RenderPersonNode
RenderPersonNode(node);
}
else if (node is AssetNode){
// call Derive class RenderAssetNode
RenderAssetNode(node);
}
.
.
.
}
Even though this is done in base class and derived Renderer will just implement specific rendering code, this is not a good OO design. In case I add a new Tree node I'll need to change all renderer and to avoid this situation we need to add render code to tree node itself which will again need to be sync when a new renderer is introduced. So we have multiple kind of tree node and multiple kind of renderer. How can we design this to avoid type checking and avoid change one class if a new kind of another class.