2015-05-06 4 views
4

Так что я пытаюсь сделать здесь проходит один и тот же экземпляр класса (class A) к другому классу (class B), но class B является инстанс в class A.Как передавать объекты между классами

Использование new заявления в class B не будет работать, потому что это вызовет бесконечный цикл, а также создание нового экземпляра этого, когда я хочу, чтобы иметь возможность использовать переменные из 1-го экземпляра class A.

Я знаю о object.equals(), но я не могу использовать его, пока не определю объект class A в class B. Просто используя object.equals приводит к пустой ссылке.

public partial class class_A : Form 
{ 
    public class_B _class_B = new class_B; 
    public Int32 var; 

    private void setclassA() 
    { 
     _class_B._class_A.equals(this); 
    } 
} 

public class class_B 
{ 
    public class_A _class_A;  // I know this is null 
    // code 
} 

Как я уже сказал, я хочу избежать создания новой копии класса А, потому что я хочу, чтобы значения в классе А были установлены.

Я пробовал использовать метод для этого, но все равно получаю нулевую ссылку.

+4

Вы _completely_ непонимание 'Equals()'. – SLaks

+6

'class_B._class_A = this' - правильный путь,' Equals' - это проверка, чтобы убедиться, что оба экземпляра равны (в этом случае они не могут быть). –

+1

Кстати, когда вы отправляете код в качестве примера, убедитесь, что он компилируется. Это поможет нам скопировать код и отладить вашу проблему, а не плохой код. Здесь много, что не будет компилироваться и никогда не будет компилироваться. –

ответ

3

Pass A в конструкторе B:

public class A 
{ 
    private B _b; 

    public A() 
    { 
     _b = new B(this); 
    } 
} 

public class B 
{ 
    private A _a; 

    public B(A a) 
    { 
     _a = a; 
    } 
} 

Как уже упоминалось в комментариях вы полностью недоразумение .Equals(). Он используется для сравнения того, равны ли два объекта, а не ссылки на клон/прохождение.

+0

Спасибо. Это фиксировало это. –

0

Попробуйте это:

public class A 
{ 
    public B Instance_B; 

    public A(B b) 
    { 
     Instance_B = b; 
    } 
} 

public class B 
{ 
    public A Instance_A; 

    public B() 
    { 
     Instance_A = new A(this); 
    } 
} 
+4

Если вы хотите преподавать хорошие практики, используйте общедоступные свойства, а не общедоступные поля. –

-2

Использование get; set;

В Class A:

public partial class class_A : Form 
{ 
    Class_B B = new Class_B(); 
    B.Class_A = this; 
    public Int32 var; 
} 

Тогда в Class B:

public class class_B 
{ 
    Class_A A { get; set; } 
    // code 
} 
+0

Его путь, но чисто использование get; set; (Свойства) не решает или не изменяет актуальную проблему. –

1

Вы на 75%. Как уже упоминалось, Рон, просто изменить .equals(this) к = this следующим образом:

_class_B._class_A = this; 

Объяснение

Если мы хотим передать ту же копию ClassA в ClassB, и сделать это, когда мы создаем ClassB внутри ClassA, то мы используем ключевое слово this, которое представляет текущий экземпляр класса.

Хотя есть и другие способы, чтобы дать this к ClassB, ниже пример показывает два:

  1. проход this конструктору и выполнить задание свойств в ClassB или
  2. присвоить this непосредственно свойству в ClassB.

Ключ для вас является то, что = является оператор присваивания, тогда как Equals() проверяет, находится ли две переменные ссылаются на один и тот же объект или нет.

Пример

public class ClassA 
{ 
    public ClassB MyClassB1 { get; set; } 
    public ClassB MyClassB2 { get; set; } 

    public ClassA() 
    { 
     // pass `this` to the constructor 
     this.MyClassB1 = new ClassB(this); 

     // pass `this` directly to a property in `ClassB` 
     this.MyClassB2 = new ClassB(); 
     this.MyClassB2.MyClassA = this; 
    } 
} 

public class ClassB 
{ 
    public ClassA MyClassA { get; set; } 

    public ClassB() { } 

    public ClassB(ClassA classA) 
    { 
     // do property assignment in the constructor 
     this.MyClassA = classA; 
    } 
} 

Доказательство концепции

This runs as a Fiddle here и печатает «Они же объект» и некоторые другие вещи тоже в более поздней версии.

using System; 
public class Program 
{ 
    public static void Main() 
    { 
     var classA = new ClassA(); 

     if(classA.Equals(classA.MyClassB1.MyClassA) && 
      classA.Equals(classA.MyClassB2.MyClassA) && 
      classA.MyClassB1.MyClassA.Equals(classA.MyClassB2.MyClassA)) 
     { 
      Console.WriteLine("They are the same object."); 
     } 
    } 
} 

Важно отметить, что, когда мы используем это, мы даем ClassBссылка наClassA не копию. Это разные вещи.

Смежные вопросы