use abstract class