On Tue, 01 Jan 2019 14:05:43 +0000, Victor Porton wrote: > In Ada2012 there are "subtypes". Subtypes can have tighter constraints > (such as type invariants) than their base types. > > I have a struct X in D. Is it possible to define a type equivalent to X > except that having tighter invariants?
In D, structs don't participate in inheritance. Classes do, but invariants aren't inherited; they're specific to the class in which the function is defined. (Which is probably a bug and I filed https://issues.dlang.org/ show_bug.cgi?id=19537.) I see three ways to make this work today: 1. Use alias this to wrap the struct. Add invariants that deal with the wrapped struct's fields. 2. Use compile-time reflection to copy the fields over, then manually copy the invariants over and add more. 3. Use a class. Define a virtual function like 'doInvariant()`. Call it from the base class's invariant{} block. > As I understand if I derive Y from X, then it is no more X; that is I > cannot use X (even provided it matches Y invariants) where I need Y. So > in D it is impossible, right? With classes, a derived class instance can be used anywhere you expect a base class instance. The reverse is not true.