#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) {} } }
Комментариев нет:
Отправить комментарий