#c_sharp
В приложенном коде (код упрощен) я, по замыслу, желал переназначить значение переменной с помощью буферной другой. В процессе я понял, что делаю это неверно, т.к. кличка питомца все же выдавалась изначальная. Как же мне, выполнить это преобразование? namespace Project { class Program { static void Main(string[] args) { Animal[,] Animals = new Animal[10, 10]; for (int i = 0; i < 10; i++) for (int j = 0; j < 10; j++) Animals[i,j] = new Animal(0,0,"Unknow"); //FindCat(Animals) = new Cat(FindCat(Animals).X, FindCat(Animals).Y, "Jake"); //Ошибка компиляции, "иду иным путем" Animal Buffer = FindCat(Animals); Buffer = new Cat(Buffer.X, Buffer.Y, "Jake"); //Не работает и при //Buffer = new Cat(FindCat(Animals).X, FindCat(Animals).Y, "Jake"); Console.Write(Animals[5,5].Name);//Unknow! Console.Read(); } static Animal FindCat(Animal[,] a) { //На деле выбор сложнее, но не думаю, что столь важно то, //как выбирается индекс здесь, но выбор обязателен return a[5, 5]; } } class Animal { public string Name; public int Y; public int X; public Animal() { } public Animal(int x, int y, string name) { X = x; Y = y; Name = name; } } class Cat : Animal { public string Color; public Cat(int x, int y, string name) { X = x; Y = y; Name = name; } } }
Ответы
Ответ 1
Присвоение нового значения переменной Buffer (Buffer = new Cat(...);) изменит куда указывает переменная (ссылка, reference) Buffer, а переменная (ссылка, reference) Animals[5, 5] будет продолжать указывать на старый объект. static Animal GetAtCatPosition(Animal[,] animals) { return animals[5, 5]; } static void PutAtCatPosition(Animal[,] animals, Animal a) { animals[5, 5] = a; } Animal Buffer = GetAtCatPosition(Animals); PutAtCatPosition(Animals, new Cat(Buffer.X, Buffer.Y, "Jake")); Вариант 2 (Омега) Fundamental theorem of software engineering: public class AnimalHolder { public Animal Animal { get; set; } } static AnimalHolder FindCat(AnimalHolder[,] a) { return a[5, 5]; } AnimalHolder[,] Animals = new AnimalHolder[10, 10]; for (int i = 0; i < 10; i++) for (int j = 0; j < 10; j++) Animals[i,j] = new AnimalHolder() { Animal = new Animal(0, 0, "Unknown") }; AnimalHolder Buffer = FindCat(Animals); Buffer.Animal = new Cat(Buffer.X, Buffer.Y, "Jake"); Console.Write(Animals[5,5].Animal.Name);//Jake! Console.Read();Ответ 2
Исправил namespace Project { class Program { static void Main(string[] args) { AngryAnimal MyAnimal = new AngryAnimal("Jake"); ////////////////////// Animal Pet; Pet = MyAnimal; Pet.Name = "Jack"; Console.Write(MyAnimal.Name);//Jack Console.Read(); } } class Animal { public string Name; public Animal(string name, int a, int b, int c) {Name = name;} } class AngryAnimal : Animal { public AngryAnimal(string name) :base(name, 1, 2, 3) {} } }
Комментариев нет:
Отправить комментарий