我如何改进我的类设计,以改进以下场景的代码

本文关键字:代码 何改进 我的 | 更新日期: 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
    }
}