【问题标题】:Cleaner way to instantiate different derived classes based on collection size?根据集合大小实例化不同派生类的更简洁方法?
【发布时间】:2018-02-27 07:00:20
【问题描述】:

我一直在尝试制作一种灵活的方法,它将用不同的派生对象填充单个集合。我希望此方法还可以基于类型集合扩展其功能。问题是,为了让它看起来超级棒,我需要用一个类型替换一个显式的强制转换类名。我读到 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);                                       
        }    
    }                
}

【问题讨论】:

  • 不明白k有什么用
  • 第二个 for 循环是为每种可用类型创建一定数量的实例。在这种情况下,每个 5 个!

标签: c# refactoring


【解决方案1】:

由于它们都派生自 SentenceFactory,因此您可以将所有 if 和 cast 替换为 just

Speeches.Add(Activator.CreateInstance (POSSIBLE_OUTPUTS.AllOptions[i]) as SentenceFactory);

【讨论】:

  • 这当然可以清理一切。由于我缺乏知识,我不知道转换为基本类型是否会删除派生实例中存在的所有扩展。你觉得那里会有问题吗?
  • @SamuelJ 不,它没有。对象始终是派生类型,无论您如何将它们转换为父类型。
猜你喜欢
  • 2018-05-14
  • 2016-11-14
  • 2013-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多