我有一组函数,即 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()
{
}
}
注意:我可以拥有更多与所提供的功能组合有不同组合的表单。
我的当前设计使代码实现了所有功能,即使它不是必需的。
我觉得我可以使用策略模式,但无法提出解决方案。
请帮助我 如果可能的话,还提供一些教程
答案 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