gpt4 book ai didi

java - 如何使用多态性将对象映射到辅助类?

转载 作者:行者123 更新时间:2023-12-02 10:49:44 26 4
gpt4 key购买 nike

我想用多态性替换 switch 语句。让我们以 PostOffice 为例。该邮局发送Letter的和Package ,它们都是 Mail 的子类。发送不同类型的Mail有特定的方法。 ,所以有 LetterServicePackageService ,两者都是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 .

最佳答案

根据实际逻辑,LetterSenderPackageSender 可能确实有两种不同的方法,每个方法都有一个不同的参数。对于第一个:

 public void send(Letter letter);

第二个:

 public void send(Package letter);

为了从多态性中受益,您应该定义一个在这两个类实现的接口(interface)中定义的通用方法。例如:

public interface MailSender{
void send(Mail mail);
}

但在 Java 中,参数对于覆盖来说不是协变的。因此,您无法通过子类型化 Mail 参数来实现该接口(interface)。
因此,这意味着您必须在两个 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com