D language supports shadowing members, where the shadowed member has same name and different type on same type. Why is this enabled, and when should one use this advanced technique?