2016-09-28 1 views
2

У меня есть базовый класс, который наследуется несколькими производными классами. Я инициализирую некоторые свойства базового класса в конструкторе. Есть ли способ сделать свойство базового класса разделяемым моими производными объектами, а не создавать те же значения свойств для каждого объекта производного класса. Это действительно важно, потому что некоторые из значений свойств базового класса генерируются службами, и совместное использование этого может повысить производительность. Ниже несколько простой план, что я пытаюсь сказать:C#: make производный объект условно обменивается одним и тем же базовым объектом

public class ClassA 
{ 
    //i dont want to use static here as it will be shared for multiple codes 
    protected string country { get; set; } 
    public ClassA(string code) 
    { 
     country = CallsomeService(code); 
    } 
} 

public class ClassB : ClassA 
{ 
    public ClassB(string code) : base(code) 
    { 
     //blah blah 
    } 

    public void DomeSomethingWithCountry() 
    { 
     Console.WriteLine($"doing this with {country} in classB"); 
    } 
} 

public class ClassC : ClassA 
{ 
    public ClassC(string code) : base(code) 
    { 
     //blah blah 
    } 

    public void DomeSomethingWithCountry() 
    { 
     Console.WriteLine($"doing soemthing else with {country} in classC"); 
    } 
} 

Теперь делает объекты, как показано ниже

 public void test() 
     { 
      //call service for this 
      var classb=new ClassB("1"); 
      //dont call service for this 
      var classc=new ClassC("1"); 
classb.DomeSomethingWithCountry(); 
classc.DomeSomethingWithCountry(); 
      //call service for this as code is different 
      var classb1=new ClassB("2"); 
     } 
+0

Если я сделаю его статическим для всех кодов, он всегда будет возвращаться в одну и ту же страну. – Unnie

+0

Передайте один экземпляр объекта в конструкторе, который содержит значение «Значение» _ (кеш) _ –

+0

@SwagataPrateek, эти свойства базового класса будут использоваться только по методам производного класса – Unnie

ответ

6

Вы можете хранить результат того уравнял статически, а не само значение.

public class ClassA 
{ 
    static Dictionary<string,string> codeToCountryLookup 
     = new Dictionary<string,string>(); 
    protected string country { get; set; } 
    public ClassA(string code) 
    { 
     if(!codeToCountryLookup.ContainsKey(code)) 
      codeToCountryLookup.Add(code,CallsomeService(code)); 
     country = codeToCountryLookup[code]; 
    } 
} 

Это ни в коем случае нитевое, но должно дать вам возможность начать.

+0

Что делать, если он блокирует один объект, прежде чем проверять, содержит ли словарь определенный ключ? Это может помочь с многопоточным правом? – kuskmen

+1

Да, именно так, что правильная передача многопоточных ситуаций выходит за рамки этого вопроса. – Jamiec

+0

Это хороший вариант для начала. Я обновил свой пост. Что делать, если я использую свойство country в методах производного класса. Тогда как я могу эффективно перевести эту правую страну в методы производного класса? – Unnie

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