I think that's a very eloquent description of the problem at hand. In my example, if the interface could enforce data types, the dog class would deal with exporting the data. As usual it's a trade-off and I'd agree that good separation of concerns is far more important. Even the added complexity of the double dispatch code I posted above is a huge negative in my opinion.
I see two competing design decisions here. If we ensure that all private members are fully private, data types and all, then the Dog class must handle every task that uses Dog data, including templating. Or if we ensure good separation of concerns, then we must extract data from Dog, one way or another, which will reveal data types. I don't see how we can have it both ways, and if I had to pick the lesser of two evils, I'd say it's better to have good separation of concerns.