Возможно ли иметь два доступа к полям друг друга, не делая одно из статических? - PullRequest
0 голосов
/ 29 ноября 2018

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

public class Class1
{
    public Class2 class2;
    public int i;

    public Class1(Class2 class2, int i)
    {
        this.class2 = class2;
        this.i = i;
    }
}

public class Class2
{
    public Class1 class1;
    public int i;

    public Class2(Class1 class1, int i)
    {
        this.class1 = class1;
        this.i = i;
    }
}

public class Run1
{
    Class1 c1 = new Class1(c2,1); // Obviously doesn't work. Since it is not declared
    Class2 c2 = new Class2(c1,2);
}

Моя цель, чтобы c1 имел доступ к c2.i, а c2 имел доступ к c1.i

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

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

public class Class1
{
    public int x;
    public Class1(int a)    {x = a;}
}
public class Class2
{
    public int y;
    public Class2(int a)    {y = a;}
}
public class Pair
{
    public Class1 u;
    public Class2 v;
    public Pair(Class1 a_u, Class2 a_v) {u = a_u; v = a_v;}
    public int Function() { return u.x + v.y; }
}
class Program
{
    static void Main(string[] args)
    {
        Pair z = new Pair(new Class1(1), new Class2(2));
        int w = z.Function();
    }
}
0 голосов
/ 29 ноября 2018

Существует несколько различных решений для этого в зависимости от ваших потребностей.

Во-первых, удаление зависимости инициализации и установка свойств позже:

public class Class1
{
    public int i;
    public Class2 class2;

    public Class1(int i)
    {
        this.i = i;
    }
}

public class Class2
{
    public int i;
    public Class1 class1;

    public Class2(int i)
    {
        this.i = i;
    }
}

class Program
{
    static void Main(string[] args)
    {
        var c1 = new Class1(1);
        var c2 = new Class2(2);
        c1.class2 = c2;
        c2.class1 = c1;
    }
}

Далее один класс создается какдочерний объект другого при создании родителя:

public class Class1
{
    public int i;
    public Class2 class2;

    public Class1(int i1, int i2)
    {
        this.i = i1;
        class2 = new Class2(i2, this);
    }
}

public class Class2
{
    public int i;
    public Class1 class1;

    public Class2(int i, Class1 class1)
    {
        this.i = i;
        this.class1 = class1;
    }
}

class Program
{
    static void Main(string[] args)
    {
        var c1 = new Class1(1, 2);
        var c2 = c1.class2;
    }
}
...