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

时间:2014-10-21 05:59:59

标签: c# oop design-patterns

我有一组函数,即 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()
   {
   }

}

注意:我可以拥有更多与所提供的功能组合有不同组合的表单。

我的当前设计使代码实现了所有功能,即使它不是必需的。

我觉得我可以使用策略模式,但无法提出解决方案。

请帮助我 如果可能的话,还提供一些教程

3 个答案:

答案 0 :(得分:1)

您应该找出每种表格可能的组合。最糟糕的情况是,您将为A,B,C,D创建4个接口,然后制作几个实现其中一些的接口4.类似于Interface IAB : IA, IB

答案 1 :(得分:0)

您还可以创建一个实现整个接口isetOfFunctions的Adapter-class(它提供所有您需要的功能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
    }
}

答案 2 :(得分:0)

如果函数在大多数情况下始终相同或相同,请考虑创建一个继承自abstract的{​​{1}}类(让我们称之为Form)和实现这些功能。然后让表格E-I继承自BaseForm。现在将有一个基地"所有功能的实施。

如果某个特定表单的函数需要以不同的方式工作,您可以将基类中的函数标记为BaseForm并覆盖继承类。

virtual