2012-12-28 4 views
1

мне нужно что-то вродеклон класса в конструкторе

public class object_t 
{ 

    public object_t (string config, object_t default_obj) 
    { 
     if(/*failed to initialize from config*/) 
     { 
      this = default_obj; // need to copy default object into self 
     } 
    } 
} 

Я знаю, что это не правильно. Как реализовать этот конструктор?

+1

Я редактировал свой титул. Пожалуйста, смотрите: «Если вопросы включают« теги »в их названиях?] (Http://meta.stackexchange.com/questions/19190/), где консенсус« нет, они не должны ». –

ответ

2

Вы должны скопировать каждое поле из объекта по умолчанию на новый в конструкторе:

public class object_t 
{ 
    int A, B; 

    public object_t (string config, object_t default_obj) 
    { 
     if(/*failed to initialize from config*/) 
     { 
      this.A = default_obj.A; 
      this.B = default_obj.B; 
      //... 
     } 
    } 
} 

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

Этот подход создает копию объекта по умолчанию, а если вам нужно вернуть объект по умолчанию, вы должны использовать фабричный подход, упомянутый lc.

+0

В классе есть десятки полей. – Newbee

+1

@Newbee однако вам нужно как-то скопировать значения из объекта по умолчанию в новый. Конечно, вы можете использовать 'Reflection', чтобы сделать это с помощью одного' for'-loop, но подумайте за _dozen_ раз перед этим. – horgh

+0

См. [C# Использование Reflection для копирования свойств базового класса] (http://stackoverflow.com/questions/1198886/c-sharp-using-reflection-to-copy-base-class-properties). О том, как это сделать с помощью Reflection – horgh

3

Наиболее распространенным является, вероятно, использовать статический метод фабрики:

public class object_t 
{  
    public static object_t CreateObjectT(string config, object_t default_obj) 
    { 
     object_t theconfiguredobject = new object_t(); 

     //try to configure it 

     if(/*failed to initialize from config*/) 
     { 
      return default_obj.Clone(); 
     } 
     else 
     { 
      return theconfiguredobject; 
     } 
    } 
} 

Лучший способ сделать выше, было бы создать конструктор копирования:

public object_t (object_t obj) 
    : this() 
{ 
    this.prop1 = obj.prop1; 
    this.prop2 = obj.prop2; 
    //... 
} 

и метод, который пытается создать ваш объект из строки конфигурации:

private static bool TryCreateObjectT(string config, out object_t o) 
{ 
    //try to configure the object o 
    //if it succeeds, return true; else return false 
} 

тогда ваш метод фабрики назвать TryCreateObjectT первым, и если это не удается, конструктор копирования:

public static object_t CreateObjectT(string config, object_t default_obj) 
{ 
    object_t o; 
    return TryCreateObjectT(config, out o) ? o : new object_t(default_obj); 
} 
+0

Мне действительно нужно клонировать объект по умолчанию, потому что новый объект может переписать некоторые поля в будущем. Ваш CreateObjectT просто возвращает ссылку на объект по умолчанию. Таким образом, любые изменения полей будут влиять на объект по умолчанию. – Newbee

+0

@Newbee Хорошо, я добавил вызов 'Clone()' - здесь вы также можете использовать конструктор копирования. (См. Также второе/расширенное предложение) –

+0

Хорошо, спасибо. Кажется, нет простых способов. – Newbee

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