Generally on the point of decoupling:
Not only can there be different components of the UI rendering the same data structure. You may even have completely different UIs (Web, Desktop Application, ...) Now of course, you could subclass Person
with WebPerson
and DesktopPerson
(this already sounds wrong, doesn't it? The naming is simply not about the kind of Person - it's about something else).
Each UI could work on different kinds of Persons, e.g. Teacher
and Student
. So we get WebPerson
, WebTeacher
, WebStudent
, DesktopPerson
, DesktopTeacher
and DesktopStudent
.
Now let's say, WebPerson
defines the method "drawAddressFields()" to draw a web version of the address fields. But since WebTeacher
has to derive from Teacher
to use the additional data field "salary" (and let's assume single inheritance), it must implement "drawAddressFields()" once again!
So maybe the argument of "this will cause much more work" will help to create some motivation :-)
BTW, it will automatically lead to creating some delegate that implements the code of drawAddressField(), which will then evolve to creating a component that does the drawing separately from the data structure.