Abstract Classes and constraints?

In reply to Mark Curry:

Extending a class to add constraints is simple, you just extend it and add the constraints.

class concrete_class#(type T) implements abstract_class#(T);
 rand T address;
 // methods imps
endclass

class even_constraint#(type T) extends concrete_class#(T);
constraint even {address[0] == 0;} // assumes bit 0 is LSB of type T
endclass

Once you have the factory, it’s easy to substitute the construction of even_constraint for concrete_class. (See Using parameterized classes & factories: Object-oriented verification or SystemVerilog OOP for UVM Verification | Track session 3#)
You can also extend your API to provide lists of values to use in your concrete class

class concrete_class;

rand T address;
T address_list[];
// ... API to interact with above members
constraint {address_list.size >0 -> address inside {address_list};}