Функция мелкого копирования для дочерних классовC#

Место общения программистов C#
Ответить
Гость
 Функция мелкого копирования для дочерних классов

Сообщение Гость »


При построении системы GOAP у меня есть родительский класс Action, который содержит большую часть логики, используемой для планирования, а дочерние классы наследуются от него, предоставляя небольшой объем собственных функций, таких как EatFoodAction.

Во время планирования мне нужно создать неглубокую копию Action, которая будет действовать как узел в моем графе действий, и я не могу хоть убей понять, как написать Copy(), которая может возвращать новый экземпляр дочернего класса, а не просто новый экземпляр родительского класса Action.

Я не умею копировать поля, а возвращать класс нужного типа.

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

Простая функция копирования полей может возвращать только родительский тип, и мне не особенно хочется создавать функцию переопределения для каждого дочернего элемента. Неглубокая копия подойдет:

действие публичного класса { публичное действие Копировать() { вар newAction = новое действие(); // копируем поля вернуть новоеДействие; } } Затем клонированное действие передается в класс ActionNode(Action action):

// код планирования вар newNode = новый ActionNode(oldAction.Copy()) Я пробовал дженерики, но для работы им все равно нужен точный тип дочернего класса, и я не совсем уверен, как использовать отражение без необходимости указывать точный тип для его приведения.

Как мне вернуть тип дочернего класса или есть ли способ просто скопировать класс без необходимости вручную указывать точный тип? Все по-прежнему наследуется от базового класса Action, так что наверняка есть способ?

Спасибо :)
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»