Member 13568484 Ответов: 3

Приведение родителя к ребенку, но сохранение данных в родительском классе и передача их ребенку


Как привести родительский класс к дочернему, но не перезаписывать существующие данные в родительском классе ?

Если у меня есть это, то данные, которые уже находятся в экземпляре базового класса, будут перезаписаны новым производным().

Base derivedInstance = new Derived();
Derived good = (Derived)derivedInstance;



Надеюсь, вы поняли мой вопрос ?

Что я уже пробовал:

Base derivedInstance = new Derived();
Derived good = (Derived)derivedInstance;

3 Ответов

Рейтинг:
21

OriginalGriff

Когда вы бросаете что-то, вы ничего не "выбрасываете" из объекта, это на самом деле никак не меняет объект вообще. Все, что он делает, это меняет то, что вы можете сделать с ним в терминах вашего кода.
Подумайте на минуту о машинах.
У вас есть класс автомобиля:

public class Car
   {
   public int CountWheels { get { return 4; } }
   }
И вы используете это для создания производного класса для каждого производителя:
public class Ford : Car
   {
   public bool MadeInGermany { get { return false;} }
   }
public class MercedesBenz : Car
   {
   public bool MadeInAmerica { get { return false;} }
   }
Вы можете управлять Фордом:
Car thatCar = new Ford();
Ford thisCar = (Ford) thatCar;
Console.WriteLine("{0}:{1}", thisCar.CountWheels, thisCar.MadeInGermany);
И кастинг ничего с ним не делает - он остается и автомобилем, и Фордом.
То, что вы не можете сделать, это бросить Мерседес в Форд:
Car thatCar = new MercedesBenz();
Ford thisCar = (Ford) thatCar;
Console.WriteLine("{0}:{1}", thisCar.CountWheels, thisCar.MadeInGermany);
И система сделает исключение, потому что "Форд" и "Мерседес" - это не одно и то же: вы не можете взять значок "Мерседеса", приклеить его к "Форду" и ожидать, что люди ему поверят! :смеяться:

Если у вас есть экземпляр базового класса в derivedInstance, прежде чем вы сделаете это:
derivedInstance = new Derived();
Затем система отбросит ссылку на этот экземпляр при загрузке нового значения - но она не изменит этот экземпляр. В вашем коде
Base derivedInstance = new Derived();
derivedInstance-это новая переменная, поэтому она все равно не содержала предыдущего экземпляра, строка, определяющая переменную, задает ее первое значение.


Рейтинг:
0

RickZeeland

Вы можете использовать другой конструктор в своем производном классе, см. пример здесь:
Как инициализировать объекты с помощью инициализатора объектов (руководство по программированию на C#) | Microsoft Docs[^]
Вы также можете быть заинтересованы в ICloneable, смотрите пример здесь: [^]
Но это работает не во всех случаях, поэтому ваш вариант сериализации может быть лучше ...


Member 13568484

Спасибо. Я посмотрю немного позже сегодня, так как на данный момент я нашел обходной путь :)

Рейтинг:
0

Member 13568484

Я нашел это решение:

var serializedParent = JsonConvert.SerializeObject(parentInstance); 
 Child c  = JsonConvert.DeserializeObject<Child>(serializedParent);


это позволит вести записи из родительского класса :)