Как вызвать конструктор из тела другого конструктора?
От: Аноним  
Дата: 17.10.06 22:20
Оценка:
Можно-ли вызвать конструктор класс из другого конструктора этого же класса?
У меня такой код. По договоренности конструкторы не должны принимать null-параметров. Я хочу вызвать из конструктора 'Line(Line obj)' конструктор 'Line(string name, Point AA, Point BB)', но уже после проверки 'object.Equals(obj, null)', как это сделать?

    public Line(Line obj) //: this(obj.Name,obj.A, obj.B) - так я и сам могу, но как тогда проверить 'object.Equals(obj, null)'?
    {
        if (object.Equals(obj, null)) throw new LineException(" Аргумент в конструкторе Line(Line obj) == null");
        
//      this(obj.Name,obj.A, obj.B) - ну вот что-то вроде этого !

        LName = obj.LName;
        A = obj.A;
        B = obj.B;
    }

    public Line(string name, Point AA, Point BB)
    {
        if (object.Equals(AA, null)) throw new LineException(" Аргумент 2 в конструкторе Line(string name, Point AA, Point BB) == null");
        if (object.Equals(BB, null)) throw new LineException(" Аргумент 3 в конструкторе Line(string name, Point AA, Point BB) == null");
        if (AA == BB) throw new LineException(" Нельзя построить линию из двух совпадающих точек !", "Точка A:", AA, "Точка B:", BB);

        LName = name;
        A = AA;
        B = BB;
    }
Re: Offtopic
От: NataljaNeumann  
Дата: 17.10.06 22:40
Оценка:
Здравствуйте, Аноним, Вы писали:

А> Можно-ли вызвать конструктор класс из другого конструктора этого же класса?

А> У меня такой код. По договоренности конструкторы не должны принимать null-параметров. Я хочу вызвать из конструктора 'Line(Line obj)' конструктор 'Line(string name, Point AA, Point BB)', но уже после проверки 'object.Equals(obj, null)', как это сделать?

А>
А>    public Line(Line obj) //: this(obj.Name,obj.A, obj.B) - так я и сам могу, но как тогда проверить 'object.Equals(obj, null)'?
А>    {
А>        if (object.Equals(obj, null)) throw new LineException(" Аргумент в конструкторе Line(Line obj) == null");
        
А>//      this(obj.Name,obj.A, obj.B) - ну вот что-то вроде этого !

А>        LName = obj.LName;
А>        A = obj.A;
А>        B = obj.B;
А>    }

А>    public Line(string name, Point AA, Point BB)
А>    {
А>        if (object.Equals(AA, null)) throw new LineException(" Аргумент 2 в конструкторе Line(string name, Point AA, Point BB) == null");
А>        if (object.Equals(BB, null)) throw new LineException(" Аргумент 3 в конструкторе Line(string name, Point AA, Point BB) == null");
А>        if (AA == BB) throw new LineException(" Нельзя построить линию из двух совпадающих точек !", "Точка A:", AA, "Точка B:", BB);

А>        LName = name;
А>        A = AA;
А>        B = BB;
А>    }
А>


Зачем использовать new LineException(" Аргумент 2 в конструкторе Line(string name, Point AA, Point BB) == null");?
Если ты используешь нулевой указатель ты в любом случае получишь NullPointerException! .NET проверяет сам. Второй раз проверять не нужно.

Если эта ситуация просто неправильна используй Assert
System.Diagnosticts.Debug.Assert(AA!=null, " Аргумент 2 в конструкторе Line(string name, Point AA, Point BB) == null");



Мне помнится в Яве другой конструктор может стоять только первой командой. Может в .NETe тоже самое?
Re: Как вызвать конструктор из тела другого конструктора?
От: Красин Россия  
Дата: 17.10.06 22:43
Оценка:
Здравствуйте, Аноним, Вы писали:

В C# — только обходной путь (причем, он неудобен, если в конструкторе назначались readonly поля). Вот в Delphi.Net можно то, что вы хотите.
private void Init(string name, Point AA, Point BB)
{
  if (object.Equals(AA, null)) throw new LineException(" Аргумент 2 в конструкторе Line(string name, Point AA, Point BB) == null");
  if (object.Equals(BB, null)) throw new LineException(" Аргумент 3 в конструкторе Line(string name, Point AA, Point BB) == null");
  if (AA == BB) throw new LineException(" Нельзя построить линию из двух совпадающих точек !", "Точка A:", AA, "Точка B:", BB);

  LName = name;
  A = AA;
  B = BB;
}

public Line(Line obj) //: this(obj.Name,obj.A, obj.B) - так я и сам могу, но как тогда проверить 'object.Equals(obj, null)'?
{
  if (object.Equals(obj, null)) throw new LineException(" Аргумент в конструкторе Line(Line obj) == null");
        
  Init(obj.Name,obj.A, obj.B) - ну вот что-то вроде этого !

  LName = obj.LName;
  A = obj.A;
  B = obj.B;
}

public Line(string name, Point AA, Point BB)
{
  Init(name, AA, BB);
}
Re: Как вызвать конструктор из тела другого конструктора?
От: Красин Россия  
Дата: 17.10.06 22:46
Оценка:
Здравствуйте, Аноним, Вы писали:

Еще можно так считерить:
private static string GetName(Line obj)
{
  if (object.Equals(obj, null)) throw new LineException(" Аргумент в конструкторе Line(Line obj) == null");
  return obj.Name;
}
public Line(Line obj) : this(GetName(obj),obj.A, obj.B) {
{
  LName = obj.LName;
  A = obj.A;
  B = obj.B;
}

public Line(string name, Point AA, Point BB)
{
  if (object.Equals(AA, null)) throw new LineException(" Аргумент 2 в конструкторе Line(string name, Point AA, Point BB) == null");
  if (object.Equals(BB, null)) throw new LineException(" Аргумент 3 в конструкторе Line(string name, Point AA, Point BB) == null");
  if (AA == BB) throw new LineException(" Нельзя построить линию из двух совпадающих точек !", "Точка A:", AA, "Точка B:", BB);

  LName = name;
  A = AA;
  B = BB;
}
Re[2]: Как вызвать конструктор из тела другого конструктора?
От: Аноним  
Дата: 17.10.06 23:42
Оценка:
Здравствуйте, Красин, Вы писали:

К>Здравствуйте, Аноним, Вы писали:


К>В C# — только обходной путь (причем, он неудобен, если в конструкторе назначались readonly поля).


Чегото, обходного путия не увидел

K> Вот в Delphi.Net можно то, что вы хотите.


Да и в C++ можно, пишу то на C#
Re[2]: Как вызвать конструктор из тела другого конструктора?
От: Аноним  
Дата: 17.10.06 23:45
Оценка:
Здравствуйте, Красин, Вы писали:

К>Здравствуйте, Аноним, Вы писали:


К>Еще можно так считерить:

К>
К>private static string GetName(Line obj)
К>{
К>  if (object.Equals(obj, null)) throw new LineException(" Аргумент в конструкторе Line(Line obj) == null");
К>  return obj.Name;
К>}
К>public Line(Line obj) : this(GetName(obj),obj.A, obj.B) {
К>{
К>  LName = obj.LName;
К>  A = obj.A;
К>  B = obj.B;
К>}

К>public Line(string name, Point AA, Point BB)
К>{
К>  if (object.Equals(AA, null)) throw new LineException(" Аргумент 2 в конструкторе Line(string name, Point AA, Point BB) == null");
К>  if (object.Equals(BB, null)) throw new LineException(" Аргумент 3 в конструкторе Line(string name, Point AA, Point BB) == null");
К>  if (AA == BB) throw new LineException(" Нельзя построить линию из двух совпадающих точек !", "Точка A:", AA, "Точка B:", BB);

К>  LName = name;
К>  A = AA;
К>  B = BB;
К>}
К>


О, вот это другое дело
Непонятно только, зачем в шарпе убрали возможность "вызова конструктора из конструктора", в C++ так удобно было
Re[2]: Offtopic
От: Аноним  
Дата: 17.10.06 23:55
Оценка:
Здравствуйте, NataljaNeumann, Вы писали:

NN>Здравствуйте, Аноним, Вы писали:


А>> Можно-ли вызвать конструктор класс из другого конструктора этого же класса?

А>> У меня такой код. По договоренности конструкторы не должны принимать null-параметров. Я хочу вызвать из конструктора 'Line(Line obj)' конструктор 'Line(string name, Point AA, Point BB)', но уже после проверки 'object.Equals(obj, null)', как это сделать?

А>>
А>>    public Line(Line obj) //: this(obj.Name,obj.A, obj.B) - так я и сам могу, но как тогда проверить 'object.Equals(obj, null)'?
А>>    {
А>>        if (object.Equals(obj, null)) throw new LineException(" Аргумент в конструкторе Line(Line obj) == null");
        
А>>//      this(obj.Name,obj.A, obj.B) - ну вот что-то вроде этого !

А>>        LName = obj.LName;
А>>        A = obj.A;
А>>        B = obj.B;
А>>    }

А>>    public Line(string name, Point AA, Point BB)
А>>    {
А>>        if (object.Equals(AA, null)) throw new LineException(" Аргумент 2 в конструкторе Line(string name, Point AA, Point BB) == null");
А>>        if (object.Equals(BB, null)) throw new LineException(" Аргумент 3 в конструкторе Line(string name, Point AA, Point BB) == null");
А>>        if (AA == BB) throw new LineException(" Нельзя построить линию из двух совпадающих точек !", "Точка A:", AA, "Точка B:", BB);

А>>        LName = name;
А>>        A = AA;
А>>        B = BB;
А>>    }
А>>


NN>Зачем использовать new LineException(" Аргумент 2 в конструкторе Line(string name, Point AA, Point BB) == null");?

NN>Если ты используешь нулевой указатель ты в любом случае получишь NullPointerException! .NET проверяет сам. Второй раз проверять не нужно.

Да затем, что код приведен не полностью, LineException вместе с собой еще кучу параметров тащит! Специально заточено что-бы в случае исключения без гемороя их(параметры) собирать

NN>Если эта ситуация просто неправильна используй Assert

NN>System.Diagnosticts.Debug.Assert(AA!=null, " Аргумент 2 в конструкторе Line(string name, Point AA, Point BB) == null");

По приведенным выше причинам мне это не пригодиться. Но все равно спасибо

NN>


NN>Мне помнится в Яве другой конструктор может стоять только первой командой. Может в .NETe тоже самое?
Re: Как вызвать конструктор из тела другого конструктора?
От: -VaS- Россия vaskir.blogspot.com
Дата: 18.10.06 04:43
Оценка:
Бррр. Какой LineException? Какой Assert? ArgumentNullException даден нам майкрософтом дабы быть юзаемым в таких случаях..
Re[2]: Как вызвать конструктор из тела другого конструктора?
От: Аноним  
Дата: 18.10.06 08:31
Оценка:
Здравствуйте, -VaS-, Вы писали:

VS>Бррр. Какой LineException? Какой Assert? ArgumentNullException даден нам майкрософтом дабы быть юзаемым в таких случаях..


Да сказали-же, LineException параметры собирает при которых исключение произошло !
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.