Проблема в том, что если я переназначу его, это не повлияет на оригинал в Form1.Копия сделана в Генетике, когда я печатаю фрукты = банан.
Нет, это неправильно.Копия не производится.
В результате вы перезаписываете имеющуюся у вас ссылку Apple
ссылкой на Banana
.Это как если бы вам дали яблоко, чтобы положить в карман, и, подержав его некоторое время, вы оставляете его на земле, подбираете банан и кладете в карман.
Когдав какой-то момент вы решите съесть оригинальное яблоко без изменений, , но не потому, что вы сделали копию .Только потому, что вы просто потеряли к нему интерес и вместо этого получили совершенно не связанный фрукт.
Так что же делать?
Факт остается фактом: вы не можете изменить1021 * параметр в целом со ссылочной семантикой (CLR не позволяет хранить ссылки как члены класса, как вы сами сказали).
Если вы хотите Geneticist
изменить ссылку Fruit
,тогда вам нужно создать обертку вокруг него.Но наиболее практичным решением было бы совместить код вызова с Geneticist
:
class Geneticist
{
private Fruit fruit;
private Banana banana;
public Geneticist(Fruit fruit)
{
this.fruit = fruit;
this.banana = new Banana();
}
public Fruit Engineer()
{
fruit = banana;
return fruit; // return the new value
}
}
и кодом вызова:
fruit = new Apple();
Geneticist geneticist = new Geneticist(fruit);
fruit = geneticist.Engineer(); // use the return value this way
Console.WriteLine(fruit.Color);
Другой осуществимый подход
Как насчет того, чтобы Geneticist
узнал, как модифицировать сами фрукты?
class Geneticist
{
private Fruit fruit;
private readonly Banana banana;
private readonly Action<Fruit> engineer;
public Geneticist(Fruit fruit, Action<Fruit> engineer)
{
this.fruit = fruit;
this.banana = new Banana();
this.engineer = engineer;
}
public void Engineer()
{
this.engineer(this.banana);
}
}
И вызывающий код:
Fruit fruit = new Apple();
Geneticist geneticist = new Geneticist(fruit, f => { fruit = f; });
geneticist.Engineer();
Console.WriteLine(fruit.Color);