use interface instead of abstract class