更清洁的方法来根据集合大小实例化不同的派生类?

时间:2016-11-25 08:13:37

标签: c# refactoring

我一直在尝试制作一个灵活的方法,它将使用不同的派生对象填充单个集合。我希望这种方法还可以根据类型集合扩展其功能。问题是,为了看起来超级,我需要用类型替换显式的强制转换类名。我读到this question here,无法使用编译时未知的类名进行强制转换。

我向您提出的问题是,您将如何重构此代码,以减少重复次数并根据集合大小灵活变通?

public struct POSSIBLE_OUTPUTS
{        
    public static Type MarekType { get; private set; }
    public static Type HawkingType { get; private set; }
    public static Type GLADOSType { get; private set; }
    public static List <Type> AllOptions { get; private set; }

    static POSSIBLE_OUTPUTS()
    {
        MarekType = typeof (MarekVoice);
        HawkingType = typeof (HawkingVoice);
        GLADOSType = typeof (GLADOSVoice);
        AllOptions = new List <Type>();
        AllOptions.Add (MarekType);
        AllOptions.Add (HawkingType);
        AllOptions.Add (GLADOSType);
    }
} 

Speeches = new List <SentenceFactory>();

for (int i = 0; i < POSSIBLE_OUTPUTS.AllOptions.Count; i++)
{
    for (int k = 0; k < TOTAL_SPEECHES; k++)
    {     
        if (POSSIBLE_OUTPUTS.AllOptions[i] == POSSIBLE_OUTPUTS.MarekType)
        {
            Speeches.Add (Activator.CreateInstance (POSSIBLE_OUTPUTS.AllOptions[i]) as MarekVoice);                                       
        }

        else if (POSSIBLE_OUTPUTS.AllOptions[i] == POSSIBLE_OUTPUTS.HawkingType)
        {
            Speeches.Add (Activator.CreateInstance (POSSIBLE_OUTPUTS.AllOptions[i]) as HawkingVoice);                                       
        }

        else if (POSSIBLE_OUTPUTS.AllOptions[i] == POSSIBLE_OUTPUTS.GLADOSType)
        {
            Speeches.Add (Activator.CreateInstance (POSSIBLE_OUTPUTS.AllOptions[i]) as GLADOSVoice);                                       
        }    
    }                
}

1 个答案:

答案 0 :(得分:1)

由于它们都来自even2,你可以用

替换所有的ifs和强制转换
Goal forall n, Nat.even (n * (S n)) = true.
  intros n.
  now rewrite even_equiv_even2, even2_distr_mult, orb_negb_r.
Qed.