_Q12_ Ответов: 3

Проблема между объектами


//-------------------Class 01
public partial class Form1 : Form
{
PackCards_1 packCards_1 = new PackCards_1();
private void card1_MouseClick(object sender, MouseEventArgs e)
        {
            card13 = packCards_1.Card01; //card13 is of type Card
            //I want to transfer the properties from one Card to another Card
            //but nothing is happening
            //where do I fail?
        }
}
//-------------------Class 02
 public class PackCards_1
    {
        public Card Card01 = new Card();
        private void InitializeComponent()
        {
            Card01.point = 1;
            Card01.atack = 1;
            Card01.shield = 1;
            Card01.life = 1;
            Card01.UpdateCard();
        }
    }


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

этот код я попробовал. Я не лгу.

Philippe Mori

Вы не показываете определение Card класс. Кстати, именование элементов управления числами редко имеет смысл. И где же вопрос?

_Q12_

общественный разделяемого класса карты : элемент управления UserControl
{
публичная карта()
{
метод InitializeComponent();
}

public int point = 0;
общественные атака инт = 1;
public int shield = 1;
общественная жизнь инт = 2;

}

Richard MacCutchan

Где находится конструктор для PackCards_1- а куда вы звоните PackCards_1.InitializeComponent?

_Q12_

это весь класс.
пространство имен game_CardGame
{
PackCards_1 открытый класс
{
публичная карта Card01 = новая карта();
частный недействительными метода initializecomponent()
{
Card01. point = 1;
Card01. atack = 1;
Card01. shield = 1;
Card01. life = 1;
Card01.UpdateCard();
}

}
}

Richard MacCutchan

Я повторяю: где конструктор для PackCards_1- а куда вы звоните PackCards_1.InitializeComponent?

_Q12_

Все, что я хочу, - это получить весь "пакет" свойств из одного объекта и сбросить его в другой объект. Или альтернатива, если то, что у меня есть, не очень хорошо !!! идея состоит в том, чтобы сохранить длинный текст в 1 файле и в моем основном файле только для того, чтобы указать на это, получить весь материал из этого и в 1 строке. Простой, видимый и ясный.

Richard MacCutchan

Затем вы должны скопировать каждое свойство из одного объекта в другой, написав метод клонирования для выполнения глубокой копии.

Philippe Mori

Используйте отладчик, чтобы выяснить, как работает ваша программа, а не гадать. Прослеживая код строка за строкой, должно быть тривиально понять, что делает каждая строка.

3 Ответов

Рейтинг:
2

#realJSOP

Вам нужно написать метод в Card объект делать то, что вы хотите.

Назовите это клоном (или чем-то подходящим)

public void Clone(Card item)
{
    // either set the fields one at a time, or use reflection to get the PropertyInfo[] 
    // for all of the properties in the Card object, and loop through that array, 
    // calling the _set method for each property. (I would probably choose the 
    // reflection approach if it was me, since classes are subject to change frequently 
    // during development.) 
}


Вы также можете создать перегрузку конструктора, которая принимает Card объект в качестве параметра, а затем вы можете вызвать Clone метод оттуда, если вы создаете новый Card экземпляры с существующими Card объекты.


Рейтинг:
1

Peter Leow

Проверить это: Object.MemberwiseClone Метод (Система)[^]


_Q12_

очень интересно!
но у меня это не сработало...
Я сделал это:

общественный разделяемого класса карты : элемент управления UserControl
{
публичная карта()
{
метод InitializeComponent();
}

public int point = 0;
общественные атака инт = 1;
public int shield = 1;
общественная жизнь инт = 2;

ShallowCopy государственного карту ()
{
верните (карточку)вот это.MemberwiseClone();
}

}

и в форме 1 :
PackCards_1 packCards_1 = новый PackCards_1();
частная card1_MouseClick недействительным(объект отправителя, MouseEventArgs е)
{
card13 = packCards_1.Card01.Мелководье();
}

Я думаю, что сделал все хорошо, как подсказывает ваш пример, но результат тот же, что и раньше - ничего не происходит.

Рейтинг:
1

F-ES Sitecore

card13 = new Card();
card13.point = packCards_1.Card01.point;
card13.atack = packCards_1.Card01.atack;
// do the same for the rest of the properties


_Q12_

card13 = packCards_1.Card01; //-- я имею в виду, что он получает все свойства из card01, не перепечатывая их все.
Я сделал новую карточку13 = new Card ();, но это то же самое, что и раньше - никаких изменений.

F-ES Sitecore

Когда вы это сделаете

card13 = packCards_1. Card01

вы не копируете свойства поперек, вы заставляете "card13 "указывать на тот же объект в памяти, на который указывает" packCards_1.Card01", поэтому обе переменные ссылаются на один и тот же объект, поэтому, если вы внесете изменения в card13.point, вы увидите, что packCards_1.Card01 также обновил свое свойство point. Google для "value variables vs reference variables" для статей, которые углубляются в это глубже. Если вы действительно хотите скопировать объект, вам нужно скопировать свойства один за другим, как описано выше, или использовать что-то вроде Clone или MemberwiseClone, чтобы сделать копию объекта. Простое присвоение переменной чему-то другому не создает копии.

_Q12_

да, вы правы.. между ними копируются только свойства ... Все, что я хочу, - это получить весь "пакет" свойств из одного объекта и сбросить его в другой объект. Или альтернативу !!! идея состоит в том, чтобы сохранить длинный текст в 1 файле и в моем основном файле только для того, чтобы указать на это, получить весь материал из этого и в 1 строке. Простой, видимый и ясный. Можете ли вы думать о других способах? Большое спасибо.

_Q12_

хех, это тоже не работает ...
Я сделал:
card13.точка = packCards_1.Card01.точка;
card13.атака = packCards_1.Card01.атак;
card13.щит = packCards_1.Card01.щит;
card13.жизнь = packCards_1.Card01.жизнь;
и дает мне значения по умолчанию изнутри объекта карты.
Кажется, моя Card01 не меняет значения или я не могу каким-то образом добраться до Card01... Это потому, что есть 3 класса?... есть мысли?

Philippe Mori

Не очень ясно, как эти 3 класса соотносятся друг с другом. Приведенный выше код изменяет переменную card13 так что это отличный объект, чем тот, что внутри packCards_1 но с теми же значениями (в то время они были скопированы).

Я бы рекомендовал вам более глубоко изучить язык C# и хорошую практику проектирования/кодирования, прежде чем писать много кода...

Philippe Mori

Что ж, было бы неплохо попробовать для опа, чтобы он мог понять, действительно ли это то, что он хочет сделать...

Однако если вы хотите иметь возможность копировать многие или все свойства объекта, то для этой цели обычно должна быть создана функция.