不使用运行时多态，将公共部分抽象在接口中