refactor abstract class to interface