2016-11-25 7 views
1

Ive пытался создать гибкий метод, когда он заполнит одну коллекцию различными производными объектами. Я хочу, чтобы этот метод также расширил возможности, основанные на наборе типов. Проблема в том, что для того, чтобы выглядеть супер, мне нужно заменить явное имя класса cast типом. Я прочитал 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

Я не понимаю, что это использование 'k' –

+0

Второй цикла создает определенный количество экземпляров на доступный тип. В этом случае по 5 штук! –

ответ

1

Поскольку все они происходят из SentenceFactory вы можете заменить все сослагательное наклонение и бросает только с

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

Это, безусловно, очищает вещи. Из-за моего незнания я не знаю, удалит ли в качестве базового типа все расширения, присутствующие в производном экземпляре. Как вы думаете, там будет проблема? –

+0

@SamuelJ Нет, это не так. Объекты всегда имеют производный тип, независимо от того, как вы передаете их родительским типам. –

 Смежные вопросы

  • Нет связанных вопросов^_^