передать ссылку на «это» в конструкторе - PullRequest
8 голосов
/ 09 апреля 2009

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

public class Class1
{
    Class2 _class2;

    public Class1()
    {
        _class2 = new Class2(this);
    }
}

public class Class2 
{
    Class1 _parent; //corrected typo

    public Class2(Class1 parent)
    {
        _parent = parent;
    }
}

Беда в том, что родитель всегда обнуляется.

Как правильно это сделать? (возможно, я могу обвинить мою медлительность в простуде ..)

ИЗМЕНЕНО ДЛЯ ИСПРАВЛЕНИЯ ТИПО (что не является проблемой в реальном коде!)

Ответы [ 5 ]

10 голосов
/ 09 апреля 2009

Возможно, вы неправильно набрали код, но я думаю, что вам нужно это определение для Class2 (обратите внимание на квалификатор this в конструкторе Class2):

public class Class2 
{
    Class1 parent;

    public Class2(Class1 parent)
    {
        this.parent = parent;
    }
}  
9 голосов
/ 09 апреля 2009

Технически это должно работать, если вы измените Class2, чтобы включить this.parent = parent;

Однако я не рекомендую это. Вместо этого я бы порекомендовал ленивую инициализацию вашего экземпляра class2 внутри class1. В зависимости от того, что все сделано в конструкторе Class2, вы можете потенциально привести себя в неприятные ситуации.

Создание свойства Class2 для class1 и его ленивая инициализация приведут к созданию Class2 после завершения конструктора Class1, а не во время его создания, что, скорее всего, будет менее подвержено ошибкам, если ваши классы станут более сложными.

2 голосов
/ 09 апреля 2009
Class1 parent;
_parent = parent;

_parent никогда не определяется; Вы ошиблись.

1 голос
/ 18 июля 2016

Я знаю, что это старый вопрос, но я подумал, что я бы бросил свои два цента для хорошей меры. Google привел меня сюда, чтобы он мог привести кого-то еще сюда.

Это подозрительно похоже на циклическую зависимость ... это просто запах кода, когда есть два независимых класса, которые используют / ссылаются друг на друга.

Если вы хотите иметь родительские / дочерние отношения для объектов, подумайте о создании реализации двоичного дерева (или аналогичной) для вашего класса.

Если вы хотите использовать наследование классов, используйте его правильно> Class2 является базовым классом для Class1, и ваше объявление Class1 будет public class Class1 : Class2. Вы можете ссылаться на методы Class2 в Class1 с ключевым словом base.

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

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

Append2:

Семантически, Class1 можно переписать следующим образом:

public class Class1
{
    Class2 _class2;

    public Class1()
        :this(new Class2(this))
    {
    }
    public Class1(Class2 class2)
    {
        _class2 = class2;
    }
}

... за исключением того, что это невозможно, потому что :this(new Class2(this)) имеет неправильный синтаксис. Это также то, что вы делаете. Пожалуйста, не надо.

0 голосов
/ 09 апреля 2009

Я не понимаю, почему это не должно работать. Это работает со мной.

заявил: http://vvcap.net/db/I2OZoapbIRREvQ8ymPym.htp

перешагнул: http://vvcap.net/db/ehsYqCY6JByqZQq-RXGp.htp

вот результат: http://vvcap.net/db/ZWjqb_Yv1yAisX0BYUns.htp

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...