2015-06-23 3 views
0

У меня есть следующий классфорсирование класс использовать конструктор

class MyClass 
{ 
    string _val1 = null; 
    string _val2 = null; 
    string _val3 = null; 

    public string Val1{get;set;} 
    public string Val2{get;set;} 
    public string Val3{get;set;} 

    public MyClass(){} 
    public MyClass(string val_id1, string val_id2 = null, string val_id3 = null) 
    { 
     //do some stuff.. set _val1,_val2,_val3 
    } 
} 

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

//using parameterized constructor 
MyClass TestMyClass1 = new MyClass("v1"); 
MyClass TestMyClass1 = new MyClass("v1","v2"); 

//using default constructor and setting values 
MyClass TestMyClass2 = new MyClass(); 
TestMyClass.Val1 = "my_test_value1"; 
TestMyClass.Val2 = "my_test_value2"; 
TestMyClass.Val3 = "my_test_value3"; 

Это похоже на работу достаточно, но мне нужно заставить некоторую логику, когда значение задано явно с использованием конструктора по умолчанию, а затем присваивает явные значения объекту. Например, мне нужно использовать логику в параметризованном конструкторе, даже если кто-то говорит TestMyClass.Val1 = "my_test_value1".

Таким образом, если Val1 явно задан, то для заполнения объекта необходимо использовать блок кода //do some stuff.. set _val1,_val2,_val3. Каков правильный способ сделать это?

+3

@Zack, нет, это не похоже на дубликат этого вопроса. – Habib

+0

Используйте шаблон фабрики. –

+0

@ stumped221, зачем вам это нужно, вы можете пометить свои свойства как * только для чтения * и разрешить их только через конструкторы. – Habib

ответ

3

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

class MyClass 
{ 

    private void InitializeStuff() 
    { 
     //do some stuff.. set _val1,_val2,_val3 
    } 

    string _val1 = null; 

    public string Val1 
    { 
     get { return _val1; } 
     set 
     { 
      InitializeStuff(); 
      _val1 = value; // Unless InitializeStuff sets this, in which case pass value in to it. 
     } 
    } 

    public MyClass() 
    { 
     // If needed: 
     InitializeStuff(); 
    } 

    public MyClass(string val_id1, string val_id2 = null, string val_id3 = null) 
    { 
     InitializeStuff(); 
    } 
} 
0

Переместить //do some stuff.. set _val1,_val2,_val3 в соответствующий сеттер.

class MyClass 
{ 
    string _val1 = null; 
    string _val2 = null; 
    string _val3 = null; 

    public string Val1 
    { 
     get 
     { 
      return _val1; 
     } 
     set 
     { 
      // do some stuff with _val1 
      _val1 = value; 
     } 
    } 

    public string Val2 
    { 
     get 
     { 
      return _val2; 
     } 
     set 
     { 
      // do some stuff with _val2 
      _val2 = value; 
     } 
    } 

    public string Val3 
    { 
     get 
     { 
      return _val3; 
     } 
     set 
     { 
      // do some stuff with _val3 
      _val3 = value; 
     } 
    } 

    public MyClass(){} 
    public MyClass(string val_id1, string val_id2 = null, string val_id3 = null) 
    { 
     // Don't set _valX instead set ValX 
    } 
} 
Смежные вопросы