Hey everyone!
Text is down below, just wanted to provide some C++ish pseudo-code to help me expressing my issue ('...' defines omitted details):
class Interface_Tree {
public: ...
}
class Tree : public Interface_Tree {
public: ...
private:
std::vector<Interface_Bucket> buckets;
}
class Interface_Bucket {
public: ...
add_object(Interface_Object* obj)
}
class Special_Bucket : public Interface_Bucket {
public:
add_object(Interface_Bucket_Object* obj) {
/*
If `Interface_Bucket_Object` cannot be cast to
`Special_Bucket_Object_Category`, do nothing.
This would require a dynamic_cast which I want to avoid, that
probably cannot unless restructuring.
Check what enum-type `Special_Bucket_Object_Category`
If `VERY_IMPORTANT`
use pointer `very_important_obj`.
Else
add to `objs`.
*/
}
private:
std::vector<Interface_Bucket_Object*> objs;
Interface_Bucket_Object* very_important_obj;
}
class Interface_Bucket_Object {
public: ...
}
enum Special_Bucket_Object_Category { IMPORTANT, VERY_IMPORTANT, SPAM };
class Special_Bucket_Object : public Interface {
public: ...
private:
Special_Bucket_Object_Category category;
}
I wanted to start programming to interfaces (or in C++, virtual classes) instead of actual classes (which are now just derived ones) in order to improve unit-testing etc., hence every class derives a base, that can be easily implemented differently.
But the issue is, if I have a Hash-Bucket data-structure class owning buckets that collect bucket-objects, how can the bucket differentiate characteristics of an implementation of the implemented bucket-object? Sure, I can do a dynamic-cast, if that fails just abort, but I do not want to do a dynamic-cast, because I would rather restructure my code.
I want my bucket-objects to have a flag (could also be called tag, category, ...) that notifies a bucket that this object needs the entire bucket, hence the enum in my code expressing the flags an object can raise.
If I would omit all interface-stuff, it would be fairly easy. My Bucket's add_object() method could easily only be called with that exact object and since the exact bucket-object type is now given, and not just some interface, accessing the enum is trivial via a getter-method.
And a last reminder: I'm not using virtual-classes to profit from inheritance in a sense of a bucket being able to collect a tons of different implementations, just one implementation that carries an enum. The bucket-tree won't own different types of buckets neither, just one implementation kind of bucket. The only reason I use inheritance is to enable easy unit-testing.
So, how can I access the object's category without dynamic-casting?
↧