两个业务对象的一个​​UI

时间:2010-06-07 19:12:09

标签: c# oop

我有一个非常相似的订单编辑和报价编辑屏幕。我想尽量避免这样的代码:

if (order is Order)
    SetupScreenForOrder();
if (order is Quote)
    SetupScreenForQuote();

但保持两个屏幕也不好。如果我在Quote和Order之间创建一些通用接口,那么如何处理OrderNumber或QuoteDate等字段?

处理此问题的最佳方法是什么?

3 个答案:

答案 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;
   }
}

换句话说,界面表示您想要询问对象以构建屏幕的问题。每个对象决定如何回答这些问题。

如果显示的不同,你需要问对象完全不同的问题,那么你可能应该有两个屏幕。