Adding a payload to a type

Amex Amex at gmail.com
Mon May 27 08:40:45 UTC 2019


I have some types I've declared and I'd like to magically extend 
them and add data. The problem is I inheriting from them them is 
bad news.

Suppose, for example, I have an image type that is used in an 
application. For a small part of the application it needs to 
associate with each image type an xy coordinate type that adds a 
coordinate to the image to be used by the part of the app that 
needs to have coordinates for the image. The rest of the app does 
not care or need the xy coordinates.

Inheritance solves this problem in some sense except it doesn't. 
If I want to add new data then it breaks.

class image;
class xy : image; // can only add an image.
class z : ??; ?? could be xy, image, or something else

Inheritance is not the correct thing to do here. I only want to 
associate data with an object. The hierarchy does not matter.


I could add a payload type to image but this causes problems 
since it would have to be void or of a singular type. Mainly it 
causes problems with the serializer I'm using since it can't 
handle voids(I might be able to get it to work with a special 
type but it will not be easy).


I could, of course, add a parallel struct that somehow associates 
the image it's extra data but to keep them in sync will not be 
easy since it will have to persist between runs(so the address 
could not be used).

One could think of what I'm trying to do is create a tuple that 
holds the image and any other data.

tuple(tuple(image, xy), z) // the outer tuple may occur later 
without knowing that the image has been "wrapped".

How does one normally handle this? It seems like something really 
simple to do(attach data) but it has no real programmatic way to 
do naturally that works with oop.


The main thing is that attaching different data should "stack" 
and not effect the base type or break the type hierarchy. If 
something takes an image it should take any extended object.


I feel like the only way to do this is to create a special type 
that can be serialized properly and is part of the base class... 
I'll have to do it for all the classes. Hopefully someone has 
some better ideas?





More information about the Digitalmars-d-learn mailing list