В приложенном коде (код упрощен) я, по замыслу, желал переназначить значение переменной с помощью буферной другой. В процессе я понял, что делаю это неверно, т.к. кличка питомца все же выдавалась изначальная. Как же мне, выполнить это преобразование?
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;
}
}
}
Ответ
Присвоение нового значения переменной 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();
Комментариев нет:
Отправить комментарий