【发布时间】:2010-11-30 20:49:41
【问题描述】:
我发现自己处于一种我想使用接口的情况,但我又在猜测自己。
我正在编写一个应用程序来处理保险申请。有一个 Application 对象保存有关保险申请的所有数据。这包括有关被保险人、将拥有保险单的实体以及将支付保险费用的实体的数据。
我使用实体一词是因为保单可以由个人或信托拥有(或支付)。我知道我何时与所有者或付款人打交道,但我不一定知道该所有者或付款人是个人还是信托。我最初创建了 Owner 接口来减少强制转换和基于实例的逻辑。我计划在 Payor 界面上装订,但现在我在怀疑自己。
这可能是您现在需要知道的全部内容。这是一些代码:
public class Application{
private Person insured;
private Owner owner;
private Payor payor;
...
}
public interface Owner{
public void setAddress(Address address);
public Address getAddress();
public void setId(String id);
public String getId();
public void setPIN(String pin);
public String getPIN();
}
public interface Payor{
public void setAccount(Account account);
public Account getAccount();
}
public class Person implements Owner, Payor{
...
}
public class Trust implements Owner, Payor{
...
}
我是在正确的道路上还是应该以不同的方式做这件事?让我停下来的事情是,并非每个人都会成为所有者或付款人。
当我想得更多时,我觉得 Owner 和 Payor 与其说是“行为”,不如说是“分类”。这是否使我在这里使用的接口不正确?如果是这样,您对替代解决方案有什么建议吗?最好是那些允许我继续透明地使用个人和信托作为所有者和付款人的那些?
我的部分担忧来自不太熟悉的开发人员将 Person 与 Owner 混淆,如下所示。
Application app = new Application();
Person timmy = new Person();
Owner smithFamilyTrust = new Trust();
Payor steve = new Person();
app.setInsured(timmy);
app.setOwner(smithFamilyTrust);
app.setPayor(steve);
...
//this would run, but would be wrong
if(timmy instanceof Owner){
//Do Owner Stuff.
}
//this would run, and be correct
Owner owner = app.getOwner();
//Do Owner Stuff
编辑以澄清“所有者资料”
此时,“所有者的东西”很简单。获取/设置所有者的 ID、PIN 或地址之类的事情:
//I want this
app.getOwner().getId();
app.getOwner().getPIN();
app.getOwner().getAddress();
//I don't want this
if(app.getOwner() instanceof Person){
Person owner = app.getOwner();
owner.getId();
owner.getPIN();
owner.getAddress();
} else if(app.getOwner() instanceof Trust){
Trust owner = app.getOwner();
owner.getId();
owner.getPIN();
owner.getAddress();
}
最初我认为我应该使用某种 Entity 超类并让 Person 和 Trust 扩展该类,但它们存储和检索 ID 和 PIN 的方式不同。相同行为的不同实现使我想到了接口。
我仍然可以使用实体超类,但我觉得我无法准确地表示该实体类的“通用”ID 或 PIN。我必须实现 Person 的 ID 和 PIN 逻辑或 Trust 的 ID 和 PIN 逻辑,然后在另一个类中覆盖它。这对我来说感觉不对。我想 Entity 可能是 Person 和 Trust 扩展的抽象类,但我不确定这是否比使用接口更好。
【问题讨论】:
-
你什么时候使用
timmy instanceof Owner,你会做什么“所有者的东西”?在我看来,实体是所有者还是付款人仅在特定应用程序的上下文中定义,您已经知道哪个是哪个。 -
类型系统在定义你所说的那种语义方面可能有点弱。传达这种隐性信息通常是通过其他方式完成的,选择结对编程、综合测试/规范套件中的任何一种,包括如何使用每个类的示例或老式的 powerpoint 会话。
-
@Dmitri "owner stuff" 在这一点上很简单,比如获取邮寄地址、税号或 PIN。所以,我想做的是 app.getOwner().getAddress() 而不必确定所有者是个人还是信托。
标签: java oop inheritance interface