Почему нельзя получить доступ к конструктору в теле другого конструктора? - PullRequest
4 голосов
/ 06 августа 2010

Я знаю, что могу получить доступ к конструктору в другом конструкторе, как показано ниже, но есть ли способ получить к нему доступ в теле конструктора?

public Rectangle(int size) : this(size, size)
{
    Console.WriteLine("Square Constructor Called");
    //this(size,size); i want to access like this 
}

Ответы [ 6 ]

7 голосов
/ 06 августа 2010

Вы не можете этого сделать. Полное обоснование: здесь , но в итоге:

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

4 голосов
/ 06 августа 2010

Ну, вроде.Если вы заставите это выглядеть так:

public Rectangle(int w, int h) {
    Initialize(w, h);
}
public Rectangle(int size) {
    Console.WriteLine("blah");
    Initialize(size, size);
}
private void Initialize(...) {...}
4 голосов
/ 06 августа 2010

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

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

2 голосов
/ 06 августа 2010

Нет, вы не можете получить к нему доступ таким образом. Подробнее см. this .

1 голос
/ 06 августа 2010

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

0 голосов
/ 06 августа 2010

:this(foo, bar) - это синтаксический сахар, вы ничего не можете с ним сделать, что вы не можете сделать другими способами.Тем не менее, :base(foo, bar) не является синтаксическим сахаром, так как это единственный способ вызвать рассматриваемый конструктор во время создания производного класса, особенно учитывая, что сначала у вас должен быть полностью сконструированный базовый класс, который удовлетворяет любым инвариантам, определенным в этомclass (например, если для некоторых из bar допустимы только некоторые значения foo, то перед тем, как идти дальше, будет выдано исключение).

Способ работы :base(foo, bar) позволяет классам использовать инкапсуляцию для обеспечениячто они никогда не переводятся в недопустимое состояние и все же допускают наследование, this(foo, bar) просто копирует тот же механизм для удобства программиста, когда есть общий код, используемый более чем одним конструктором.

Теперь,скажем, мы решили иметь возможность вызывать :this(foo, bar) из любого места.По сути, это будет вызов метода.Ну, мы все равно можем сделать это в конструкторе классов.Мы утратили синтаксическое сходство с :base(foo, bar) (и считаем, что некоторые люди уже знакомы с тем C ++, который снизил их кривую обучения), и просто добавили способ создать угрозу для конструктора, такого как метод, возвращающий пустоту, добавивсложность его проверки лежит в теле конструктора (и приходится иметь дело с людьми, спрашивающими, почему его нельзя вызывать в другом месте, когда теперь это выглядит так, как это возможно, или же странностью позволять это делать), когда людив любом случае можно просто создать такие методы.

В целом, я думаю, это было хорошее дизайнерское решение.

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