我有一个基类,可以编写所有常用函数。我通过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中。添加大量案例并不是一个好习惯,所以我想要一些自动分配子类的东西。
有人知道要实施的内容吗?
答案 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