struct inheritance need?

Weed resume755 at mail.ru
Wed Dec 17 08:32:21 PST 2008


Janderson пишет:
> Weed wrote:
>> I should explain why it's important for me:
>>
>> For example, I am making a matrix object(s)
>>
>> It should be:
>> - any size
>> - with ability of making matrix instance of a given size in compile time.
>> - ability of creating matrix instance in runtime.
>>
>> I have decided to make it struct because I need to create matrix
>> object in compile time. in real program I'll need matricies of
>> variable size and 3х1, 3х3, 6х6, 3х6 sizes (and may be other).
>>
>> I want to make matrix template and insert in it with mixin operator
>> several structures of different sizes (and this structs are not store 
>> his dimensions in each instance, of course: variables width and height 
>> declared as invariant). By doing this I'll get several different 
>> structures  (matrix_dynamic, matrix3x3, matrix6x6 etc)
>>
>> question is how those matricies can interoperate? They does not have
>> common parent (structures does not have inheritance) , so I can't
>> make common function for matricies of different sizes opAdd for
>> example, and have to do functions for all types of matricies.
>>
>> How should I implement such a class In D properly?     It possible in 
>> C++, but I like some of the language D
> 
> The classical approach is to have "helper" template functions. Essentially:
> 
> void doOpearation(mymatrix)(...)
> {
> 
> }

If I create struct MatrixStruct for compile-time matrix and class 
MatrixClass for all other I will not be able to create a function of 
interaction between these objects through the templates because some of 
them will be announced before the other and it will not be able to get 
another type of object in a template.

(I do not know, understand this long phrase on my strange English or 
not? : ))


> 
> 
> Note this is compiletime polymorphisms.
> 
> Now if you want to add runtime polymorphism it is impossible to get away 
> from a cost.  You can use a wrapper class like so:
> 
> interface CommonMatrix
> {
>     operation()...
> }

	
Also, interfaces can not be used with the structs


> 
> class PolymorphicMatrix(mymatrix) : CommonMatrix
> {
>     operation()...
> }
> 
> You'll probably find though that PolymorphicMartix should be some higher 
> level concept, like car, or entity.
> 
> The great thing about these techniques is that they give a whole load 
> more power then just using inheritance alone because you can essentially 
> attach many different behaviors to that struct.
> 
> I hope that was helpful.
> 
> -Joel


More information about the Digitalmars-d-learn mailing list