abstractとinterfaceとtraitはどんな風に使い分ければいいですか?