Передача метода конкретного конструктора для создания дочерних классов - PullRequest
1 голос
/ 22 октября 2011

У меня есть класс X, который использует класс Y. X создает Y, но X должен создать Y с тем же методом конструктора SAME, который использовался для создания экземпляра Y, переданного X.

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

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

И я не хочу развивать всю логику конструктора класса 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 Ответ

0 голосов
/ 22 октября 2011

Вы можете просто использовать фабрику для создания 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...