2011-11-11 2 views
0

У меня большой, абстрактный класс InfoBase с большим количеством свойств. Тогда есть несколько подклассов, которые обладают несколькими свойствами. Я Получать объект с информацией, чтобы instansiate подкласс объекта InfoBase который затем будет возвращен, что-то вроде этого:Список инициализации в разных подклассах

private static InfoBase CreateInfo(Dictionary<string, string> userInput) { 
    InfoBase info; 
    if(userInput["InfoType"] == "SomeInfo") { 
     info = new SomeInfo { 
      sharedData1 = Process(userInput["data1"]), 
      sharedData2 = ProcessDifferently(userInput["data2"] + userInput["AuxData"]), 
      // ... 
      specialData1 = Something(userInput["blah"]) 
     }; 
    } 
    else if(userInput["InfoType"] == "OtherInfo") { 
    // ... And so on 
    } 
    return info; 
} 

Почти все поля в info объект будет инициализирован таким же образом, так что я d хотел бы поделиться этой инициализацией вместо копирования/вставки ее и просто изменить специфику. Я хотел бы сделать совместную инициализацию с помощью списка инициализации, вместо того, чтобы иметь двадцать строк info.data1 = ...;. Это возможно? В идеале, что-то вроде этого:

InfoBase info = WhateverMagicStuff { 
    sharedData1 = // ... 
}; 
SomeInfo specificInfo = SomeInfo(info); 
specificInfo.specialData1 = // ... 

ответ

0

Назначить общие данные после блока if else.

private static InfoBase CreateInfo(Dictionary<string, string> userInput) { 
    InfoBase info; 
    if(userInput["InfoType"] == "SomeInfo") { 
     info = new SomeInfo { 
      // ... 
      specialData1 = Something(userInput["blah"]) 
     }; 
    } 
    else if(userInput["InfoType"] == "OtherInfo") { 
    // ... And so on 
    } 
    else { ... } 

    info.sharedData1 = Process(userInput["data1"]), 
    info.sharedData2 = ProcessDifferently(userInput["data2"] + userInput["AuxData"]), 

    return info; 
} 
0
public void PopulateInfoBase(InfoBase infoToPopulate, WhateverUserInputIs userInput) 
{ 
    infoToPopulate.sharedData1 = Process(userInput["data1"]); 
    infoToPopulate.sharedData2 = ProcessDifferently(userInput["data2"] + userInput["AuxData"]); 
    etc etc 
} 

Вызов выше функции после того, как инстанцировании конкретный подкласс вам нужно (и заполнение его «специальные» данные).

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