我如何改进我的类设计,以改进以下场景的代码
本文关键字:代码 何改进 我的 | 更新日期: 2023-09-27 18:27:12
我有一组函数,即a()、B()、C()、D(),我有5种形式,即
FromE、FormF、FormG、FormH、FormI。
所有表单都使用一些或无,或A()、B()、C()、D()中的所有函数。
我目前在做什么
创建了一个接口isetOfFunctions,该接口由A()、B()、C()和D()以及其他一些属性组成,这些属性将由在FormE、FormF、FormG、FormH和FormI 的每个表单中实现它的所有表单使用
问题
1.FormE不使用任何功能
2.FormF只使用A()、B()、C()。
3.FormG使用所有函数。
4.FormI使用B()、C()
public interface isetOfFunction
{
public int neededinAllForm
{ get;set;}
void A();
void B();
void C();
void D();
}
//None of the functions are needed
public class E:Form,isetOfFunction
{
public int neededinAllForm
{ get;set;}
public void A()
{
}
public void B()
{
}
public void C()
{
}
public void D()
{
}
}
//Only A() and B() are needed
public class F:Form,isetOfFunction
{
public int neededinAllForm
{ get;set;}
public void A()
{
}
public void B()
{
}
public void C()
{
}
public void D()
{
}
}
注意:我可以有更多的表单,它们与所提供的一组功能有不同的组合。
我目前的设计使代码能够实现所有功能,即使它不是必需的。
我觉得我可以使用策略模式,但无法想出解决方案。
请帮帮我如果可能的话,还提供一些教程
您应该找出每个表单可能的组合。最坏的情况是,您将为A、B、C、D创建4个接口,然后创建几个接口来实现其中的4个接口。类似Interface IAB : IA, IB
的东西
如果函数始终相同,或者在大多数情况下相同,请考虑创建一个继承自Form
(我们称之为BaseForm
)并实现这些函数的abstract
类。然后让表单E-I从此BaseForm
继承。现在,所有功能都将有一个单一的"基础"实现。
如果特定窗体的函数需要以不同的方式工作,可以将基类中的函数标记为virtual
,并在继承类中重写。
public abstract class BaseForm : Form {
public int needAllInForm {get;set;}
public void A() {
//default implementation here
}
public void B() {
//default implementation here
}
public void C(){
//default implementation here
}
public virtual void D() {
//default implementation here
}
}
public class F : BaseForm {}
public class G : BaseForm {
public override void D() {
//form-specific implementation of D here
}
}
您还可以创建一个实现整个接口isetOfFunctions
的Adapter类(它提供了您所需的所有功能a-D)。使这个适配器类中的每个方法都是虚拟的,并使它们的主体为空。因此,您可以在派生类中重写它,也可以不重写它。现在,您应该做的一切都是让每个类从适配器(最好是一个抽象类)继承。
现在,如果您想在表单类中定义这些方法中的任何一个,只需在那里重写它。
public abstract class BaseForm : Form {
public virtual void A() {
// leave the body empty
}
public virtual void B() {
// leave the body empty
}
public virtual void C() {
// leave the body empty
}
public virtual void D() {
// leave the body empty
}
}
public class G : BaseForm {
public override void A() {
// do what you need to
}
public override void B() {
// do what you need to
}
public override void C() {
// do what you need to
}
public override void D() {
// do what you need to
}
}