powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Вызывается больше конструкторов, чем я предполагал...
17 сообщений из 17, страница 1 из 1
Вызывается больше конструкторов, чем я предполагал...
    #39462086
Здравствуйте! Не въезжаю пока в один казус, прошу объяснить. Имеется цепочка наследования.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
public class DataTableA : DataTable
{
....
    public DataTable CloneMe()
    {
      DataTable table = this;
      return table.Clone();
    }
}

public class DataTableB : DataTableA
{
....
}

public class DataTableC : DataTableB
{
....

   public void Test()
   {
     DataTable table = this.CloneMe(); 
   }

}


Почему при вызове метода Test (класса DataTableС) последовательно вызываются

1. Конструктор DataTable
2. Конструктор DataTableA
3. Конструктор DataTableB
3. Конструктор DataTableC

Я предполагал, что вызовется только Конструктор DataTable.
...
Рейтинг: 0 / 0
Вызывается больше конструкторов, чем я предполагал...
    #39462106
stomsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Новичок ООП..,

У тебя, при вызове DataTableC.Test() вызывается метод, объявленный в родительском класса DataTableA.CloneMe().
А как ты думаешь в этом случае "this" в методах DataTableC.Test() и DataTableA.CloneMe() ссылаются на один и тот же объект или на разные?
А, если на один и тот же объект, то какого типа этот объект: DataTable, DataTableA или DataTableC?
...
Рейтинг: 0 / 0
Вызывается больше конструкторов, чем я предполагал...
    #39462143
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Новичок ООП..Я предполагал, что вызовется только Конструктор DataTable.
На основании чего базировалось такое предположение?
...
Рейтинг: 0 / 0
Вызывается больше конструкторов, чем я предполагал...
    #39462160
Супер_Пав
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Новичок ООП..Почему при вызове метода Test (класса DataTableС) последовательно вызываются

1. Конструктор DataTable
2. Конструктор DataTableA
3. Конструктор DataTableB
3. Конструктор DataTableC

Я предполагал, что вызовется только Конструктор DataTable.
Давайте немного сократим код, для понимания.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
public class DataTableA : DataTable
{
....
    public DataTable CloneMe()
    {
      DataTable table = this;
      return table.Clone();
    }
}

public class DataTableC : DataTableA 
{
....

   public void Test()
   {
     DataTable table = this.CloneMe(); 
   }

}


Согласно Вашей логике, строчка кода new DataTableC().Test() должна вызвать исключение? Но ведь этого не происходит, тк сперва срабатывают по иерархии, начиная с главного, т.е DataTable, дальше DataTableA и DataTableC. В противном случае как в дочернем классе работать с элементами родительского?
...
Рейтинг: 0 / 0
Вызывается больше конструкторов, чем я предполагал...
    #39462173
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Новичок ООП..Я предполагал, что вызовется только Конструктор DataTable.
Правильно, так и должно быть. Может реальный код не такой как ты тут привел?
...
Рейтинг: 0 / 0
Вызывается больше конструкторов, чем я предполагал...
    #39462184
Dima TНовичок ООП..Я предполагал, что вызовется только Конструктор DataTable.
Правильно, так и должно быть. Может реальный код не такой как ты тут привел?Мне незачем обманывать, Дим, тем более, что код, который я привёл, проверяется на счёт "раз", если кому не лень.
...
Рейтинг: 0 / 0
Вызывается больше конструкторов, чем я предполагал...
    #39462185
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TПравильно, так и должно быть. Может реальный код не такой как ты тут привел?
С какого перепугу? Метод Test - инстансный метод, он может быть быть вызван только после вызова конструктора DataTableC, который повлечет за собой вызовы вверх по иерархии наследования всех конструкторов базовых классов без параметров.
...
Рейтинг: 0 / 0
Вызывается больше конструкторов, чем я предполагал...
    #39462193
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Метод DataTable.Clone() виртуальный. Если ты его переопределил в DataTableC и там создаешь объект DataTableC, то вызовется вся цепочка конструкторов.
...
Рейтинг: 0 / 0
Вызывается больше конструкторов, чем я предполагал...
    #39462194
stomsky,
до меня дошло, что в this (метода CloneMe) попадает объект типа DataTableC
но то, что в переменную table типа DataTable (того же метода) попадает объект типа DataTableC
для меня явилось полной неожиданностью
...
Рейтинг: 0 / 0
Вызывается больше конструкторов, чем я предполагал...
    #39462198
Dima TМетод DataTable.Clone() виртуальный. Если ты его переопределил в DataTableC и там создаешь объект DataTableC, то вызовется вся цепочка конструкторов.Метод Clone я НЕ переопределял, и в мыслях такого не было.
...
Рейтинг: 0 / 0
Вызывается больше конструкторов, чем я предполагал...
    #39462206
Сон Веры ПавловныМетод Test - инстансный метод, он может быть быть вызван только после вызова конструктора DataTableC, который повлечет за собой вызовы вверх по иерархии наследования всех конструкторов базовых классов без параметровТак не в этом же дело! А в том, что вся эта цепочка конструкторов вызывается при срабатывании Clone из DataTable !
...
Рейтинг: 0 / 0
Вызывается больше конструкторов, чем я предполагал...
    #39462217
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Новичок ООП..код, который я привёл, проверяется на счёт "раз", если кому не лень.
Затестил, так и есть.
Вот что в хэлпе по этому поводу
https://msdn.microsoft.com/ru-ru/library/system.data.datatable.clone(v=vs.110).aspx Комментарии

Если эти классы являются производными, копия также будет производным классом.
т.е. DataTable.Clone() вернет объект DataTableC поэтому при создании нового объекта вызываются все конструкторы.
...
Рейтинг: 0 / 0
Вызывается больше конструкторов, чем я предполагал...
    #39462223
Dima TDataTable.Clone() вернет объект DataTableCвот-вот, в этом вся суть.
...
Рейтинг: 0 / 0
Вызывается больше конструкторов, чем я предполагал...
    #39462226
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Новичок ООП..Так не в этом же дело! А в том, что вся эта цепочка конструкторов вызывается при срабатывании Clone из DataTable !
Раз:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
internal DataTable Clone(DataSet cloneDS) {
  IntPtr hscp;
  Bid.ScopeEnter(out hscp, "<ds.DataTable.Clone|INFO> %d#, cloneDS=%d\n", ObjectID, (cloneDS != null) ? cloneDS.ObjectID : 0);
  try {
    DataTable clone = CreateInstance();
    if (clone.Columns.Count > 0) // Microsoft : To clean up all the schema in strong typed dataset.
      clone.Reset();
    return CloneTo(clone, cloneDS, false);
  }
  finally {
    Bid.ScopeLeave(ref hscp);
  }
}


Два:
Код: c#
1.
2.
3.
protected virtual DataTable CreateInstance() {
  return (DataTable) Activator.CreateInstance(this.GetType(), true);
}


this в данном случае указывает на фактический тип, и именно его (DataTableC) создает вызов Activator.CreateInstance(this.GetType(), true) - с вызовом конструктура, и, как выше было написано, всех остальных вышестоящих по иерархии наследования.
...
Рейтинг: 0 / 0
Вызывается больше конструкторов, чем я предполагал...
    #39462232
Спасибо, товарищи!
Суть вопроса вы уловили верно и я теперь понял это загадочное происшествие.
Теперь заодно может подскажете, как мне клонировать объект DataTableC в объект DataTable (мне в принципе только структуру столбцов скопировать надо) без создания объекта типа DataTableC ?
...
Рейтинг: 0 / 0
Вызывается больше конструкторов, чем я предполагал...
    #39462248
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Новичок ООП..Теперь заодно может подскажете, как мне клонировать объект DataTableC в объект DataTable (мне в принципе только структуру столбцов скопировать надо) без создания объекта типа DataTableC ?
Код: c#
1.
2.
3.
4.
public DataTable CloneMe()
{
  return new DataView(this, "0=1", null, DataViewRowState.CurrentRows).ToTable();
}
...
Рейтинг: 0 / 0
Вызывается больше конструкторов, чем я предполагал...
    #39462271
Сон Веры Павловны
Код: c#
1.
  return new DataView(this, "0=1", null, DataViewRowState.CurrentRows).ToTable();

браво, маэстро! То, что нужно.
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Вызывается больше конструкторов, чем я предполагал...
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]