use base interface not impl