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 案例中分配了更多类。添加大量案例并不是一个好习惯,所以我想要一些自动分配子类的东西。

有人知道要实施的东西吗?

4

1 回答 1

0

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

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

public class implement
{

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

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

最后,您还可以查看创建模式系列,以获取有关对象创建问题和一些众所周知的解决方法的灵感。

高温高压

于 2013-02-25T11:35:10.433 回答