C # — передача метода конкретного конструктора для создания «дочерних» классов

#c# #c#-4.0 #constructor

#c# #c #-4.0 #конструктор

Вопрос:

У меня есть класс X, который использует класс Y. X создает Y, но X должен создать Y с ТЕМ ЖЕ методом конструктора, который использовался для создания экземпляра -Y передается X.

  • Это не клон, потому что я хочу, чтобы НОВЫЙ объект-Y не равнялся значениям экземпляра-Y, переданным X.
  • Это не экземпляр, потому что я не хочу, чтобы ТОТ ЖЕ объект-Y, который передается как экземпляр-Y, передавался в X.

Я хотел бы передать «метод и параметры конструктора» класса Y классу X и, используя эту информацию, создать новый Y-экземпляр, используя ctor-method-passed .

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

Я сделал небольшой скачок, чтобы объяснить себя немного лучше.

Спасибо.

 using System;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            TheSon son1 = new TheSon();

            son1.TheValue = "Another Value";

            TheFather<TheSon> father1 = new TheFather<TheSon>(son1);
            Console.WriteLine("Result is {0}:", "Empty constructor".Equals(father1.MySon.TheValue));
            Console.WriteLine("tbecause prop. must be: '{0}' and it is: '{1}'", "Empty constructor", father1.MySon.TheValue);

        }

        public class TheFather<T> where T: TheSon
        {
            public TheSon MySon { get; set; }

            public TheFather(T mySon) {
                // I would like to NOT use the same object but
                // use the constructor that was used to build the passed object-instance.
                // 
                // Or perhaps pass a concrete TheSon constructor to the 'TheFather'...
                this.MySon = (TheSon)mySon;
            }
        }

        public class TheSon 
        {
            public string TheValue { get; set; }

            public TheSon()
            {
                this.TheValue = "Empty constructor";
            }

            public TheSon(string value)
            {
                this.TheValue = value;
            }

            public TheSon(string value, int element)
            {
                this.TheValue = value   "-> "   Convert.ToString(element);
            }        
        }
    }
}
 

========= РЕШЕНИЕ:
Добавление этого конструктора в класс TheFather:

 public TheFather(Func<T> sonFactory)
        {
            this.MySon = (T)sonFactory();
        }
 

И с этим примером:

 static void Main(string[] args)
        {
            // Uncomment one of this to change behaviour....
            //Func<TheSon> factory = () => new TheSon();
            Func<TheSon> factory = () => new TheSon("AValue");
            //Func<TheSon> factory = () => new TheSon("AValue", 1);

            TheFather<TheSon> father1 = new TheFather<TheSon>(factory);
            Console.WriteLine("Result is {0}:", "AValue".Equals(father1.MySon.TheValue));
            Console.WriteLine("tbecause prop. must be: '{0}' and it is: '{1}'", "AValue", father1.MySon.TheValue);
        }
 

Работает как шарм …. 🙂

Спасибо…

Ответ №1:

Вы можете просто использовать фабрику для создания TheSon объектов:

 Func<TheSon> factory = () => new TheSon(); // creates one with default ctor
 

Таким образом, вы можете каждый раз получать новый объект, но созданный точно таким же образом (это не ограничивается конструктором; вы также можете включить любой дополнительный код, который вы хотите). Используйте это так:

 var oneSon = factory(); // creates one son
var secondSon = factory(); // creates another with the same constructor
var father = new TheFather(factory()); // ditto
 

Обновление: вы также можете изменить TheFather конструктор, чтобы принять фабрику, если хотите создать TheSon внутри TheFather . Например:

 public TheFather(Func<T> sonFactory) {
    this.MySon = (TheSon)sonFactory();
}
 

и

 var father = new TheFather(factory);
 

Комментарии:

1. И как я могу решить, какой из трех конструкторов «TheSon» должен использовать «Отец» для создания экземпляра «TheSon»? Помните: ‘TheFather’ должен создать класс ‘TheSon’ внутри, но КАКОЙ ctor выбрать, должен быть «выбран» вне класса ‘TheFather’.

2. @FerPt: смотрите Обновленный ответ. По сути, просто передайте саму фабрику TheFather .