我想用多态替换switch语句。让我们以PostOffice
为例。该邮局发送Letter
和Package
,它们都是Mail
的子类。有几种发送不同类型的Mail
的特定方法,因此有一个LetterService
和PackageService
,两者都是MailService
的
public class PostOffice {
@Inject
private LetterSender letterSender;
@Inject
private PackageSender packageSender;
public void send( Mail mail ) {
if ( mail instanceof Letter ) {
letterSender.send( (Letter) mail );
} else if ( mail instanceof Package ) {
packageSender.send( (Package) mail );
}
}
}
如何避免有条件和instanceof?有人告诉我可以使用多态性删除它们,但是我仍然不明白如何将正确的
Mail
类型“路由”到正确的MailSender
。 最佳答案
根据实际逻辑,LetterSender
和PackageSender
可能确实有两种不同的方法,每种方法都有一个不同的参数。
对于第一个:
public void send(Letter letter);
对于第二个:
public void send(Package letter);
要从多态中受益,您应该定义在这两个类实现的接口中定义的通用方法。例如 :
public interface MailSender{
void send(Mail mail);
}
但是在Java中,
overriding
的参数不是协变的。因此,您无法通过对Mail
参数进行子类型化来实现该接口。因此,这意味着您必须在两个Sender类中实现
void send(Mail mail)
,例如:public class LetterSender implements MailSender{
@Override
public void send(Mail mail){
// ...
}
}
public class PackageSender implements MailSender{
@Override
public void send(Mail mail){
// ...
}
}
要实现它,您应该从较高的角度定义
Mail
,在其中定义任何Mail
子类所需的行为/方法。每个
Mail
子类将为其定义实现。因此,这两个发送方实现可以处理
send(Mail mail)
而不需要向下转换参数。关于java - 如何使用多态将对象映射到助手类?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52265690/