change the interface to abstract class