后期绑定类的设计模式(没有用于类赋值的switch case)

时间:2013-02-25 09:23:35

标签: oop design-patterns c#-3.0

我有一个基类,可以编写所有常用函数。我通过virtual关键字覆盖了这个函数的很多类。像,

public class Base
{
   public virtual void sample()
   {
     ..............
   }
}

public class a : Base
{
   public override sample()
   {

   }
}

public class implement
{

   public void ToSample()
   {
     Base baseclass = new Base();

     Switch(test)
     {
        case a: baseclass = a();
         break;

        case b: baseclass = b();
        break; 
     }

    baseclass.sample();
   }

}

这个完美的代码适用于当前情况,但现在我有更多的类要分配在switch case中。添加大量案例并不是一个好习惯,所以我想要一些自动分配子类的东西。

有人知道要实施的内容吗?

1 个答案:

答案 0 :(得分:0)

如评论中所述,您可以使用dependency injection来解除实施。但请注意,在某些情况下,您无法选择进行此类切换(例如,当您需要根据套接字中收到的文本创建类时)。在这种情况下,重要的是始终将switch语句封装在一个方法中,并让你的对象依赖它(换句话说,不要将它复制并粘贴到任何地方:))。这里的想法也是让您的系统与潜在有害的代码隔离开来。当然,如果你添加一个新类,你将不得不去修改那个方法,但是你只需要在一个时间和一个特定的地方进行。

我见过(有时使用过)的另一种方法是在值和类之间建立映射。因此,如果您的类创建开关依赖于整数代码,您基本上可以在代码和类之间创建映射。你在这里做的是变成一个静态的"切换到动态行为,因为您可以随时更改映射内容,从而改变程序的行为方式。一个典型的实现就像是(抱歉伪代码,我不熟悉C#):

public class implement
{

   public void ToSample()
   {
     class = this.mapping.valueForKey(test);
     Base baseclass = new class();
     baseclass.sample();
   }
}

但是请注意,要使此示例正常工作,您需要reflection支持,这取决于您使用的语言(再次,抱歉,但我不知道C#细节)。

最后,您还可以查看creational模式系列,了解有关对象创建问题的灵感以及解决它们的一些众所周知的形式。

HTH