2014-02-21 3 views
0

Я хотел бы запросить, как лучше всего справиться с ситуацией ниже.Несколько функций с различными параметрами в C#

Я бы хотел позвонить заполнить функция для разных экземпляров с различными параметрами. Я реализовал заселяет функцию в каждом классе наследования. Но я не знаю, как лучше всего использовать его сотни раз.

(Например, индекс будет общим числом стран мира).

public enum TCountry 
{ 
    tAustralia, 
    tUnitedKingdom, 
    .. etc.. 
} 
public enum TCity 
{ 
    tSydney, 
    tLondon, 
    ... etc.. 
} 
public int ProcessData (string population, int index) 
{ 
    switch (index) 
    { 
     case 0: 
     TypeAust aus = new TypeAust(); 
     retun aus.poulate(population, tAustralia, tSydney); 
     // Different calculation Sydney -Aus 
     DisplayAus(); // Display for Sydney - Aus 

     case 1: 
     TypeUK uk = new TypeUK(); 
     retun uk.poulate(population, tUnitedKingdom, tLondon); 
     // Different calculation for Londond - UK 
     DisplayUK(); // Display for London - UK 
     .... 
     ... etc.. 
    } 
} 

Заранее спасибо

+2

Могу ли я спросить, что это так отличается, как вы «заселить» для разных стран, что требует конкретного подкласса каждый? –

+0

* насекомое * - это как раз и пример. Я хотел бы сделать какое-то декодирование и преобразование необработанных данных в * fillulate *. Он отличается для каждого подкласса. Я реализовал суперкласс и подкласс. Но проблема в том, что я не знаю, как правильно их потреблять сотни раз. – sMah

+0

Вы получите гораздо лучшие ответы/помощь, если вы объясните свои реальные потребности, а не только некоторые абстрактные. –

ответ

0

Я рекомендовал бы с различным дизайном. Вместо того, чтобы работать с этим заявлением, поместите все ваши типы в коллекцию и вызовите заполнение, не зная, с каким конкретным типом вы работаете.

List<TypeCountry> countries = new List<TypeCountry>() { new TypeUK(), TypeAus(), TypeUS() //ect }; 
//use this list all throughout the program 

Вместо вас вы можете сделать заявление о смене оператора;

return countries[index].populate(//args go here); 

Тогда вы можете делать другие вещи;

int worldPop = countries.Aggregate((c, n) => c.Populate(//args) + n.Populate(//args)); 

В общем, вам необходимо прекратить обработку каждого типа, как если бы он отличался от следующего. Переместите свою логику в базовый класс, избавьтесь от кода, который должен ссылаться на тип по имени или потребует определенных проверок, для которых он наследуется. Для почти всех случаев вы должны иметь коллекцию типов базовых классов и передавать ее и работать над ней, даже не зная, к какому типу относится конкретный экземпляр, с которым вы имеете дело. Если это не так, вы делаете наследование неправильно. Если у вас есть этот аргумент большого дела, тогда нет смысла даже использовать наследование, потому что, насколько я могу судить, вы не получаете никаких преимуществ.

0

Мне нужно было бы увидеть больше ваших реальных потребностей и архитектуры, но вы могли бы изучить дженерики.

public int ProcessData<T>(string population) where T : BaseCountry, new() { 
    var country = new T(); 
    Display(country); 
    return country.Populate(population); 
} 

public void Display<T>(T country) where T : BaseCountry { ... } 

Вы бы использовать ProcessData как:

ProcessData<TypeAust>(99); 

Ваш метод отображения будет родовое тоже. Таким образом, ваш метод данных процесса всегда ограничен работой любого, что реализует BaseCountry. BaseCountry определит абстрактный или виртуальный метод Populate().

0

Вы могли бы сделать что-то подобное, так что логика разбита на различные классы:

public enum TCountry 
{ 
    tAustralia, 
    tUnitedKingdom 
} 
public enum TCity 
{ 
    tSydney, 
    tLondon 
} 

public abstract class TypeCountry 
{ 
    public abstract int Populate(string population); 
} 

public class TypeAust : TypeCountry 
{ 
    public override int Populate(string population) 
    { 
     // do your calculation with tAustralia, tSydney... 
    } 
} 

public class TypeUK: TypeCountry 
{ 
    public override int Populate(string population) 
    { 
     // do your calculation with tUnitedKingdom, tLondon... 
    } 
} 

public static class TypeCountryFactory 
{ 
    public static TypeCountry GetCountry(TCountry country) 
    { 
     switch (country) 
     { 
      case TCountry.tAustralia: 
       return new TypeAust(); 
      case TCountry.tUnitedKingdom: 
       return new TypeUK(); 
     } 
    } 
} 

public int ProcessData (string population, int TCountry) 
{ 
    TypeCountry country = TypeCountryFactory.GetCountry(TCountry); 

    return country.Populate(population); 
} 
Смежные вопросы