我有一个非常相似的订单编辑和报价编辑屏幕。我想尽量避免这样的代码:
if (order is Order)
SetupScreenForOrder();
if (order is Quote)
SetupScreenForQuote();
但保持两个屏幕也不好。如果我在Quote和Order之间创建一些通用接口,那么如何处理OrderNumber或QuoteDate等字段?
处理此问题的最佳方法是什么?
答案 0 :(得分:1)
我认为这两个对象之间的通用接口是个好主意。
也许将不常见的字段定义为可空,并让屏幕检查为null并确定如何显示这些字段。
int? OrderNumber {get;set;}
DateTime? QuoteDate {get;set;}
编辑:回应JC的评论
或许考虑尝试更进一步,至少在逻辑上,将订单和报价视为同一类型的对象,但处于“订单生命周期”的不同阶段。即“报价”是生命周期开始时的订单,而“订单”是生命周期中间或末尾的订单。
您可以在界面上定义OrderState属性,然后您的UI可以使用OrderState属性来决定如何显示引用/顺序,而不是单独检查每个数据。
如果您觉得问题更多的是UI中有太多if语句,那么可以考虑创建小型用户控件来处理显示引用或订单的UI块。然后,您可以动态地将适当的控件(引用控件或订单控制)添加到UI,或者已经添加了两个控件,并根据需要显示/隐藏它们。不过,我会提醒说,这听起来可能是一种混乱的方法,所以请注意,解决方案最终不会比您尝试解决的问题更复杂。
答案 1 :(得分:1)
Foo foo = GetFoo();
if (foo is Order)
...
if (foo is Quote)
...
如果您不想编写这些条件,请避免按其公共父类型(如果有)引用Order实例和Quote实例。
Order order = GetOrder()
SetupScreen(order); // resolves to void SetupScreen(Order order)
Quote quote = GetQuote()
SetupScreen(quote); //resolves to void SetupScreen(Quote quote)
答案 2 :(得分:1)
通常,如果两个类的显示屏幕相似,那是因为它们的字段功能相似,即使它们的名称不同。
例如,可能每个(订单或报价)实例都会显示一个日期。所以你可能有一个界面:
interface displayableInOrderAndQuoteList {
Date getDisplayDate();
}
public class Order {
private Date orderDate;
public Date getOrderDate() { //used only when treating object as an order
return orderDate;
}
public Date getDisplayDate() {//used when displaying object via interface
return orderDate;
}
}
public class Quote {
private Date quoteDate;
public Date getQuoteDate() { //used only when treating object as a quote
return quoteDate;
}
public Date getDisplayDate() {//used when displaying object via interface
return quoteDate;
}
}
换句话说,界面表示您想要询问对象以构建屏幕的问题。每个对象决定如何回答这些问题。
如果显示的不同,你需要问对象完全不同的问题,那么你可能应该有两个屏幕。