2009-06-09 3 views
0

ниже код состоит из два класса:Как я могу заставить конструктор C# быть фабрикой?

  • SmartForm (простая модель класса)
  • SmartForms (множественном класс, который содержит коллекцию SmartForm объектов)

Я хочу иметь возможность создавать экземпляры как особых, так и множественных классов вот так (т.е. Я не хочу фабричный метод GetSmartForm()):

SmartForms smartForms = new SmartForms("all"); 
SmartForm smartForm = new SmartForm("id = 34"); 

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

Как это сделать? Я попытался назначить объект this, который не работает.

using System.Collections.Generic; 

namespace TestFactory234 
{ 
    public class Program 
    { 
     static void Main(string[] args) 
     { 
      SmartForms smartForms = new SmartForms("all"); 
      SmartForm smartForm = new SmartForm("id = 34"); 
     } 
    } 

    public class SmartForm 
    { 
     private string _loadCode; 

     public string IdCode { get; set; } 
     public string Title { get; set; } 

     public SmartForm() {} 

     public SmartForm(string loadCode) 
     { 
      _loadCode = loadCode; 
      SmartForms smartForms = new SmartForms(_loadCode); 
      //this = smartForms.Collection[0]; //PSEUDO-CODE 
     } 

    } 

    public class SmartForms 
    { 
     private string _loadCode; 

     public List<SmartForm> _collection = new List<SmartForm>(); 
     public List<SmartForm> Collection 
     { 
      get 
      { 
       return _collection; 
      } 
     } 

     public SmartForms(string loadCode) 
     { 
      _loadCode = loadCode; 
      Load(); 
     } 

     //fills internal collection from data source, based on "load code" 
     private void Load() 
     { 
      switch (_loadCode) 
      { 
       case "all": 
        SmartForm smartFormA = new SmartForm { IdCode = "customerMain", Title = "Customer Main" }; 
        SmartForm smartFormB = new SmartForm { IdCode = "customerMain2", Title = "Customer Main2" }; 
        SmartForm smartFormC = new SmartForm { IdCode = "customerMain3", Title = "Customer Main3" }; 
        _collection.Add(smartFormA); 
        _collection.Add(smartFormB); 
        _collection.Add(smartFormC); 
        break; 
       case "id = 34": 
        SmartForm smartForm2 = new SmartForm { IdCode = "customerMain2", Title = "Customer Main2" }; 
        _collection.Add(smartForm2); 
        break; 
       default: 
        break; 
      } 
     } 
    } 
} 

ответ

4

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

public SmartForm(string loadCode) 
{ 
    _loadCode = loadCode; 
    SmartForms smartForms = new SmartForms(_loadCode); 
    this.IdCode = smartForms[0].IdCode; 
    this.Title = smartForms[0].Title; 
} 
+0

Точно, я ищу что-то подобное, все, что мне нужно, это простые свойства, но для любого типа объекта он должен быть динамическим, я думаю о каком-то классе «клонирование через отражение», t есть что-то подобное, например System.Reflection.Clone (SmartForms [0])? –

2

Вы можете использовать модификатор internal или protected для конструктора, вместо public. Такой, что:

public SmartForm() {} 
public SmartForm(string loadCode) 
{ 
    _loadCode = loadCode; 
    SmartForms smartForms = new SmartForms(_loadCode); 
    //this = smartForms.Collection[0]; //PSEUDO-CODE 
} 

становится:

internal SmartForm() {} 
internal SmartForm(string loadCode) 
{ 
    _loadCode = loadCode; 
    SmartForms smartForms = new SmartForms(_loadCode); 
    //this = smartForms.Collection[0]; //PSEUDO-CODE 
} 
7

Вы не можете получить один объект "стать" другой.

Используйте статические методы вместо конструкторов (и сделайте конструкторы private/internal/whatever так, чтобы к ним могли обращаться только статические методы). Есть много преимуществ для использования статических методов над конструкторами:

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

недостатком является то, что они не работают с C# коллекция/инициализаторы объектов :(

Альтернатива статическим методам (которые, по общему признанию, не очень хорошо работают с инъекцией зависимостей) заключается в том, чтобы иметь отдельный метод экземпляра фабрики и вызова.

3

Вы не можете. Microsoft делает это, определяя публичный статический метод Create(). См. Например, WebRequest и HttpWebRequest в пространстве имен System.Net. Я предлагаю вам сделать то же самое.

Сделайте конструктор базового класса внутренним или закрытым, поэтому он не может быть непосредственно создан. Или еще лучше, сделайте его абстрактным классом.Используйте скрытые конструкторы в реализации Create().

0

Вы могли бы сделать частный класс под названием SmartFormData, и поставить все значения в нем.

Сделать SmartForms множественном класс поддерживать коллекцию этих объектов и сделать SmartForm сингулярного конструктора найти правильный экземпляр SmartFormData в SmartForms множественном числе.

Затем сделать все свойства в SmartForm особой выборки значения из SmartFormData

Однако, лучший способ сделать это, чтобы иметь приватный конструктор и использовать фабричный метод.

Есть ли причина, по которой вы должны использовать конструктор?

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

  • Нет связанных вопросов^_^