在一个HIS的项目开发中我负责《医疗技术模块》的开发,
中间有两个界面,一个是 医技申请的确认界面,另一个是医技申请的冲红界面
两个界面的元素基本一致,但是调用的查询方法和确认方法不一样。
我设计的是 确认界面作父类,冲红界面作子类。
开始 用了以下的代码:
确认界面的确认按键Click代码:
private void btEnter_Click(object sender, EventArgs e)
{
try
{
if (执行科室ComboBox.Visible && null == 执行科室ComboBox.SelectedValue)
throw new Exception("请先选择一个执行科室!");
else
{
if (this.Text == "医技申请单确认") //根据窗口的标题去决定怎么干活,有点无赖
DRHis.Exam.Bus.Exam.Confirm( 医技申请单号 , 执行科室ComboBox.SelectedValue.ToString(), 操作员TextBox.EmpId.ToString(), 检验师TextBox.EmpId.ToString());
else if (this.Text == "医技申请单冲红")
DRHis.Exam.Bus.Exam.RefundExam( 医技申请单号 , 操作员TextBox.EmpId.ToString());
else
return;
}
医技申请单号清空();
重新查询申请(登陆部门, PerformFlag);
}
catch(Exception Ex)
{ MessageBox.Show(Ex.Message); }
}
冲红界面没有确认按键代码。
第一次修改:将父类的 按键Click代码 改为保护级别(原来私有),去掉 窗口标题判断的 if语句,在子类 重写按键代码,
还将 操作员TextBox控件和 医技申请单号 变量的级别也变为了保护级别(原来私有)
确认界面的确认按键Click代码:
protected void btEnter_Click(object sender, EventArgs e)
{
try
{
if (执行科室ComboBox.Visible && null == 执行科室ComboBox.SelectedValue)
throw new Exception("请先选择一个执行科室!");
else
DRHis.Exam.Bus.Exam.Confirm( 医技申请单号 , 执行科室ComboBox.SelectedValue.ToString(), 操作员TextBox.EmpId.ToString(), 检验师TextBox.EmpId.ToString());
医技申请单号清空();
重新查询申请(登陆部门, PerformFlag);
}
catch(Exception Ex)
{ MessageBox.Show(Ex.Message); }
}
冲红界面代码的确认按键Click代码:
protected new void btEnter_Click(object sender, EventArgs e)
{
try
{
if (执行科室ComboBox.Visible && null == 执行科室ComboBox.SelectedValue)
throw new Exception("请先选择一个执行科室!");
else
DRHis.Exam.Bus.Exam.RefundExam( 医技申请单号 , 操作员TextBox.EmpId.ToString());
医技申请单号清空();
重新查询申请(登陆部门, PerformFlag);
}
catch (Exception Ex)
{ MessageBox.Show(Ex.Message); }
}
其实不是很满意,许多代码重复出现造成不易维护, 3个地方的私有被破坏就为了一个小小的功能,有些失败。
第二次修改:将父类的按键Click代码 改为原来的私有,还将 操作员TextBox控件和 医技申请单号 变量 的级别也变为了原来的私有
抽象出变化的部分作成模板(保护级别)
确认界面的确认按键Click代码:
private void btEnter_Click(object sender, EventArgs e)
{
try
{
if (执行科室ComboBox.Visible && null == 执行科室ComboBox.SelectedValue)
throw new Exception("请先选择一个执行科室!");
else
ExecuteTemplate( 医技申请单号 ,操作员TextBox.EmpId.ToString());
医技申请单号清空();
重新查询申请(登陆部门, PerformFlag);
}
catch(Exception Ex)
{ MessageBox.Show(Ex.Message); }
}
模板代码:
protected virtual void ExecuteTemplate(string _医技申请单号 ,string 操作员Id)
{
DRHis.Exam.Bus.Exam.Confirm(_医技申请单号 , 执行科室ComboBox.SelectedValue.ToString(), 操作员Id, 检验师TextBox.EmpId.ToString());
}
冲红界面代码:
确认按键Click代码已经被去除,换成模板代码:
protected override void ExecuteTemplate(string _医技申请单号 ,string 操作员Id)
{
DRHis.Exam.Bus.Exam.RefundExam(_医技申请单号 , 操作员Id);
}
还算比较满意了,用了 模板设计模式 实现了一定意义上的窄接口。
其实应该是先作一个抽象类,然后 确认界面 和 冲红界面都派生自这个类,但是不知为什么如果Form类申明为抽象(abstract)的话,子类的设计器打不开,很是奇怪。
只好用了上面的方法。因为如果不是 抽象类就不能定义抽象方法,那也还是只能用虚方法了。
如果用委托的话要先在程序集中定义委托还要在子类加一句委托赋值,反而更麻烦。
如果谁有更好的方法请留言