Перейти к содержимому

Как копировать в классе

  • автор:

Копирование наборов классов объектов, классов объектов и таблиц в базу геоданных

Скопировать или переместить наборы данных можно следующими способами:

  • Используйте команды контекстного меню, клавиши быстрого доступа или перетаскивание при работе в панели Каталог или в виде Каталог . Подробнее см. раздел Копирование и перемещение элементов.
  • Используйте инструменты геообработки, к примеру инструмент Копировать в наборе инструментов Управление данными. Этот инструмент работает так же, как команда Копировать на панели Каталог , копируя входные данные из одного местоположения и вставляя их в другое.

Можно копировать наборы классов объектов, отдельные классы пространственных объектов или таблицы. Для каждого набора классов объектов, класса пространственных объектов и таблицы, при копировании в базе геоданных назначения создаются новые наборы классов объектов, классы пространственных объектов и таблицы, содержащие все объекты или записи из источника. Если вы копируете в файловую или многопользовательскую базу геоданных, вы можете указать ключевое слово конфигурации чтобы контролировать процесс размещения новых классов пространственных объектов и таблиц.

При копировании и вставке также происходит копирование любых зависимых данных. Соответственно, если вы копируете сетевой набор данных или класс топологии, будут скопированы все участвующие в них классы пространственных объектов. Если вы копируете класс пространственных объектов или таблицу, участвующие в классе отношений, класс отношений и все входящие в него классы пространственных объектов и таблицы будут также скопированы. То же самое относится и к классам объектов, имеющим объектно-связанные аннотации: будут скопированы и объектно-связанные аннотации. При копировании класса пространственных объектов с правилами атрибутов копируются все правила атрибутов и любые дополнительные классы пространственных объектов или последовательности, указанные в правилах атрибутов. Что касается обладающих доменами, подтипами или индексами классов пространственных объектов, скопированы будут также домены, подтипы и индексы.

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

Используйте команды контекстного меню

Копировать

Можно скопировать любой набор из базы геоданных или базы данных посредством команды Копировать контекстного меню на панели Каталог и вставить его в целевую базу геоданных. Есть два способа вставки наборов данных в целевую базу геоданных: Вставить и Специальная вставка .

Вставить

Вставить

Чтобы скопировать таблицы, классы или наборы объектов на панели Каталог с помощью команды Вставить , выполните следующие действия.

  1. На панели Каталог подключитесь к многопользовательской базе геоданных или базе данных, содержащей набор классов объектов, класс объектов или таблицу, которые необходимо скопировать.
  2. Щелкните набор объектов, класс объектов или таблицу правой кнопкой мыши и выберите Копировать Копировать.
  3. Щелкните правой кнопкой на базе геоданных, куда хотите скопировать данные.
  4. Щёлкните на Вставить Вставить.

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

Подсказка:

Чтобы копировать геометрическую сеть или класс топологии и все участвующие классы пространственных объектов, копируйте и вставьте только сеть или топологию класса. Это скопирует все участвующие в них классы пространственных объектов тоже. Вы не можете копировать и вставлять отдельные классы пространственных объектов, участвующие в сети или в топологии.

Специальная вставка

Чтобы лучше контролировать вставку данных в целевую базу геоданных, выберите в контекстном меню опцию Специальная вставка . В диалоговом окне Специальная вставка появится список наборов данных, которые вставляются в целевую базу геоданных. Любые конфликты имен автоматически разрешаются и подсвечиваются красным. Чтобы переименовать копируемый элемент, вы можете изменить параметр Имя цели . Если вы вставляете данные в файловую или многопользовательскую базу геоданных и хотите контролировать процесс создания и размещения новых классов пространственных объектов и таблиц, щелкните ключевое слово конфигурации из ниспадающего списка Ключевое слово конфигурации . Атрибутивные домены, связанные с копируемыми наборами данных, также перечислены в этом диалоговом окне, но только для информации, т.е., например, невозможность переименования выходного домена.

Примечание:

Вариант Специальная вставка доступен в контекстном меню только для добавленных в проект баз геоданных.

  1. На панели Каталог подключитесь к многопользовательской базе геоданных или базе данных, содержащей набор классов объектов, класс объектов или таблицу, которые необходимо скопировать.
  2. Щелкните правой кнопкой на наборе классов объектов, классе пространственных объектов или таблице, которые хотите скопировать, и выберите Копировать Копировать.
  3. Щелкните правой кнопкой на базе геоданных, куда хотите скопировать данные.
  4. Щелкните Специальная вставка Вставить.

Появится диалоговое окно Специальная вставка , отображающее, какие данные копируются. Любые конфликты имен автоматически разрешаются и подсвечиваются красным.

В целевой базе геоданных появится индикатор выполнения, отображающий процесс выполнения операции копирования-вставки. Вы можете отменить операцию копирования-вставки, щелкнув кнопку остановки на индикаторе выполнения. Копии набора объектов, класса объектов или таблицы и связанных с ними элементов появятся в целевой базе геоданных.

Копирование объектов с помощью Экспорта

Можно экспортировать объекты слоя в новый класс объектов, используя инструмент геообработки Копировать объекты , открытый при выборе вами Экспорта объектов в контекстном меню слоя на панели .

  1. Добавьте слой на карту.
  2. В панели щелкните слой правой кнопкой мыши на слое и выберите Экспорт > Экспорт объектов .
Примечание:

Если на карте выбраны объекты, инструмент Копировать объекты скопирует только выбранные объекты. Чтобы включить в класс объектов все объекты, убедитесь, что вы очистили выборку перед экспортом объектов.

Откроется инструмент геообработки Копировать объекты . Параметр Входные объекты заполнен выбранным вами слоем.

Копирование нескольких классов объектов

Можно использовать инструмент геообработки Класс объектов в базу геоданных для экспорта одного или нескольких классов объектов из одной базы геоданных в другую.

Примечание:

Имейте в виду, что инструмент Класс объектов в базу геоданных копирует только простые классы объектов. Например, если классы пространственных объектов, которые вам нужно экспортировать, содержатся в наборе классов объектов, то скопированы будут только классы пространственных объектов. Набор классов объектов и все его дополнительные элементы, например, топологии, классы отношений и вложения, не будут скопированы в выходную базу геоданных.

  1. Откройте инструмент геообработки Класс объектов в базу геоданных . Это можно сделать, отыскав его на панели Геообработка , либо указав на него в наборе Конвертация , в группе инструментов База геоданных .
  2. Добавьте классы пространственных объектов в параметр Входные объекты , щелкнув кнопку Обзор и выбрав нужные вам классы. Если же у вас на карте есть открытые в виде слоев карты классы объектов, воспользуйтесь ниспадающем меню в параметре Входные объекты и выберите копируемый слой.
  3. Используйте кнопку Обзор для параметра Выходная база геоданных , чтобы выбрать выходную базу геоданных, в которую вы хотите скопировать классы пространственных объектов.
  4. Щелкните Запустить , чтобы запустить инструмент.
Подсказка:

Аналогичный рабочий процесс можно использовать для копирования нескольких таблиц из одной базы геоданных в другую с помощью инструмента геообработки Таблица в базу геоданных .

Как копировать в классе

И что Вы делали? И что не получается? Можете внятно описать проблему, так как не приходиось сталкиваться с какими либо трудностями при копировании.

_________________
«После» — не значит «вследствие»

Заголовок сообщения: Re: Копирование стандартных «Класс\интерфейс»
Добавлено: Пт, сен 25 2009, 12:16

Дело в том, что при использовании класса и метода (CALL METHOD GD_REF_TO_MENUE02->SHOW_BUTTONS) мне необходимо расширить структуру RFPOSXEXT которая в методе SHOW_BUTTONS объявлена как IT_RFPOSXEXT типом структуры RFPOSXEXT. Структурку скопировал (ZRFPOSXEXT) добавил необходимые поля, и теперь нужно поправить это в методе т.к. именно он выдает конечный результат.

Заголовок сообщения: Re: Копирование стандартных «Класс\интерфейс»
Добавлено: Пт, сен 25 2009, 13:13
Malych написал:

Дело в том, что при использовании класса и метода (CALL METHOD GD_REF_TO_MENUE02->SHOW_BUTTONS) мне необходимо расширить структуру RFPOSXEXT которая в методе SHOW_BUTTONS объявлена как IT_RFPOSXEXT типом структуры RFPOSXEXT. Структурку скопировал (ZRFPOSXEXT) добавил необходимые поля, и теперь нужно поправить это в методе т.к. именно он выдает конечный результат.

И.
Я вижу только описание задачи, но не вижу ни просто вопроси, ни описания проблемы с копированием метода, класса, отчёта. Если «нужно поправить это в методе», то правьте.

_________________
«После» — не значит «вследствие»

Заголовок сообщения: Re: Копирование стандартных «Класс\интерфейс»
Добавлено: Пт, сен 25 2009, 13:32

С классом CL_EX_FI_ITEMS_MENUE01 проблемка, нужно его скопировать но не получается через транз se24. Скопировать — чтоб поправить параметр IT_ITEMS на другой тип (ZRFPOSXEXT) вместо IT_RFPOSXEXT. Вот в этом пока трудности.

Заголовок сообщения: Re: Копирование стандартных «Класс\интерфейс»
Добавлено: Пт, сен 25 2009, 13:44
Malych написал:

С классом CL_EX_FI_ITEMS_MENUE01 проблемка, нужно его скопировать но не получается через транз se24. Скопировать — чтоб поправить параметр IT_ITEMS на другой тип (ZRFPOSXEXT) вместо IT_RFPOSXEXT. Вот в этом пока трудности.

Пошли уже на второй круг:
И что Вы делали? И что не получается? Можете внятно описать проблему?

_________________
«После» — не значит «вследствие»

Заголовок сообщения: Re: Копирование стандартных «Класс\интерфейс»
Добавлено: Пт, сен 25 2009, 13:49
Malych написал:
С классом CL_EX_FI_ITEMS_MENUE01 проблемка.

И вообще — уж говорите тогда всё — зачем Вам вдруг понадобилось копировать badi FI_ITEMS_MENUE01?

_________________
«После» — не значит «вследствие»

Заголовок сообщения: Re: Копирование стандартных «Класс\интерфейс»
Добавлено: Пт, сен 25 2009, 14:20
Malych написал:

С классом CL_EX_FI_ITEMS_MENUE01 проблемка, нужно его скопировать но не получается через транз se24. Скопировать — чтоб поправить параметр IT_ITEMS на другой тип (ZRFPOSXEXT) вместо IT_RFPOSXEXT. Вот в этом пока трудности.

Этот параметр в классе менять нельзя, т.к. вызов вашего класса будет идти с типом параметра IT_RFPOSXEXT.

_________________
С уважением,
Удав.

Заголовок сообщения: Re: Копирование стандартных «Класс\интерфейс»
Добавлено: Пт, сен 25 2009, 14:36

Для построения отчета использую стандартную транзакцию FBL3N. Т.к. срок маленький на разработку нового отчета, я скопировал данную программу, расширил структура на два поля (наименование деб\кред, счет деб\кред),в дебаге структура выходная идет с этими новыми полями и с данными. Привел все к одному. При выходной форме этих полей нет т.к. в данном классе тип параметра идет типом структуры без этих добавочных полей, поэтому предположил что если поменять тип на свой т.е. параметр IT_ITEMS сделать типом ZRFPOSXEXT, то все получиться. В связи с этим возник вопрос о копировании данного класса\метода. Которые используются ФМ так же привел к одному. программа работает , дампа нет, но в выводе нет этих полей

Заголовок сообщения: Re: Копирование стандартных «Класс\интерфейс»
Добавлено: Пт, сен 25 2009, 14:54
Malych написал:

Для построения отчета использую стандартную транзакцию FBL3N. Т.к. срок маленький на разработку нового отчета, я скопировал данную программу, расширил структура на два поля (наименование деб\кред, счет деб\кред),в дебаге структура выходная идет с этими новыми полями и с данными. Привел все к одному. При выходной форме этих полей нет т.к. в данном классе тип параметра идет типом структуры без этих добавочных полей, поэтому предположил что если поменять тип на свой т.е. параметр IT_ITEMS сделать типом ZRFPOSXEXT, то все получиться. В связи с этим возник вопрос о копировании данного класса\метода. Которые используются ФМ так же привел к одному. программа работает , дампа нет, но в выводе нет этих полей

Вы всё-таки теорию почитайте.
Класс Вам копировать не надо. Если очень хочется, то можно скопировать badi-определение или вообще выкинуть его из z-копии.
Если z-поля не выводятся в ALV, то проверяйте в первую очередь что, как и где у Вас заполняется каталог полей.

_________________
«После» — не значит «вследствие»

Заголовок сообщения: Re: Копирование стандартных «Класс\интерфейс»
Добавлено: Пт, сен 25 2009, 15:18

А не проще ли было просто использовать ЛБД SDF с тем же экраном, что в FBL3N для сбора данных, а доп. обработку и вывод на экран сделать самому?

_________________
С уважением,
Удав.

Копирование объектов и ссылки

Одно из фундаментальных отличий объектов от примитивов заключается в том, что объекты хранятся и копируются «по ссылке», тогда как примитивные значения: строки, числа, логические значения и т.д. – всегда копируются «как целое значение».

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

Давайте начнём с примитива, такого как строка.

Здесь мы помещаем копию message во phrase :

let message = "Привет!"; let phrase = message;

В результате мы имеем две независимые переменные, каждая из которых хранит строку «Привет!» .

Вполне очевидный результат, не так ли?

Объекты ведут себя иначе.

Переменная, которой присвоен объект, хранит не сам объект, а его «адрес в памяти» – другими словами, «ссылку» на него.

Давайте рассмотрим пример такой переменной:

let user = < name: "John" >;

И вот как это на самом деле хранится в памяти:

Объект хранится где-то в памяти (справа от изображения), в то время как переменная user (слева) имеет лишь «ссылку» на него.

Мы можем думать о переменной объекта, такой как user , как о листе бумаги с адресом объекта на нем.

Когда мы выполняем действия с объектом, к примеру, берём свойство user.name , движок JavaScript просматривает то, что находится по этому адресу, и выполняет операцию с самим объектом.

Теперь вот почему это важно.

При копировании переменной объекта копируется ссылка, но сам объект не дублируется.

let user = < name: "John" >; let admin = user; // копируется ссылка

Теперь у нас есть две переменные, каждая из которых содержит ссылку на один и тот же объект:

Как вы можете видеть, все ещё есть один объект, но теперь с двумя переменными, которые ссылаются на него.

Мы можем использовать любую переменную для доступа к объекту и изменения его содержимого:

let user = < name: 'John' >; let admin = user; admin.name = 'Pete'; // изменено по ссылке из переменной "admin" alert(user.name); // 'Pete', изменения видны по ссылке из переменной "user"

Это как если бы у нас был шкафчик с двумя ключами, и мы использовали один из них ( admin ), чтобы войти в него и внести изменения. А затем, если мы позже используем другой ключ ( user ), мы все равно открываем тот же шкафчик и можем получить доступ к изменённому содержимому.

Сравнение по ссылке

Два объекта равны только в том случае, если это один и тот же объект.

Например, здесь a и b ссылаются на один и тот же объект, поэтому они равны:

let a = <>; let b = a; // копирование по ссылке alert( a == b ); // true, обе переменные ссылаются на один и тот же объект alert( a === b ); // true

И здесь два независимых объекта не равны, даже если они выглядят одинаково (оба пусты):

let a = <>; let b = <>; // два независимых объекта alert( a == b ); // false

Для сравнений типа obj1 > obj2 или для сравнения с примитивом obj == 5 объекты преобразуются в примитивы. Очень скоро мы изучим, как работают преобразования объектов, но, по правде говоря, такие сравнения требуются очень редко и обычно они появляются в результате ошибок программиста.

Клонирование и объединение, Object.assign

Итак, копирование объектной переменной создаёт ещё одну ссылку на тот же объект.

Но что, если нам всё же нужно дублировать объект? Создать независимую копию, клон?

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

Но если мы действительно этого хотим, то нам нужно создать новый объект и воспроизвести структуру существующего, перебрав его свойства и скопировав их на примитивном уровне.

let user = < name: "John", age: 30 >; let clone = <>; // новый пустой объект // давайте скопируем все свойства user в него for (let key in user) < clone[key] = user[key]; >// теперь clone это полностью независимый объект с тем же содержимым clone.name = "Pete"; // изменим в нём данные alert( user.name ); // все ещё John в первоначальном объекте

Также мы можем использовать для этого метод Object.assign.

Object.assign(dest, [src1, src2, src3. ])
  • Первый аргумент dest — целевой объект.
  • Остальные аргументы src1, . srcN (может быть столько, сколько необходимо) являются исходными объектами
  • Метод копирует свойства всех исходных объектов src1, . srcN в целевой объект dest . Другими словами, свойства всех аргументов, начиная со второго, копируются в первый объект.
  • Возвращает объект dest .

Например, мы можем использовать его для объединения нескольких объектов в один:

let user = < name: "John" >; let permissions1 = < canView: true >; let permissions2 = < canEdit: true >; // копируем все свойства из permissions1 и permissions2 в user Object.assign(user, permissions1, permissions2); // теперь user =

Если скопированное имя свойства уже существует, оно будет перезаписано:

let user = < name: "John" >; Object.assign(user, < name: "Pete" >); alert(user.name); // теперь user =

Мы также можем использовать Object.assign для замены цикла for..in для простого клонирования:

let user = < name: "John", age: 30 >; let clone = Object.assign(<>, user);

Он копирует все свойства user в пустой объект и возвращает его.

Также существуют и другие методы клонирования объекта. Например, с использованием оператора расширения clone = <. user>, рассмотренного далее в учебнике.

Вложенное клонирование

До сих пор мы предполагали, что все свойства user примитивныe. Но свойства могут быть и ссылками на другие объекты. Что с ними делать?

Например, есть объект:

let user = < name: "John", sizes: < height: 182, width: 50 >>; alert( user.sizes.height ); // 182

Теперь недостаточно просто скопировать clone.sizes = user.sizes , потому что user.sizes – это объект, он будет скопирован по ссылке. Таким образом, clone и user будут иметь общий объект sizes :

let user = < name: "John", sizes: < height: 182, width: 50 >>; let clone = Object.assign(<>, user); alert( user.sizes === clone.sizes ); // true, тот же объект // user и clone обладают общим свойством sizes user.sizes.width++; // изменяем свойства в первом объекте alert(clone.sizes.width); // 51, видим результат в другом

Чтобы исправить это, мы должны использовать цикл клонирования, который проверяет каждое значение user[key] и, если это объект, тогда также копирует его структуру. Это называется «глубоким клонированием».

Мы можем реализовать глубокое клонирование, используя рекурсию. Или, чтобы не изобретать велосипед заново, возьмите готовую реализацию, например _.cloneDeep(obj) из библиотеки JavaScript lodash.

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

Объекты, объявленные как константа, могут быть изменены

Важным побочным эффектом хранения объектов в качестве ссылок является то, что объект, объявленный как const , может быть изменён.

const user = < name: "John" >; user.name = "Pete"; // (*) alert(user.name); // Pete

Может показаться, что строка (*) вызовет ошибку, но, это не так. Значение user это константа, оно всегда должно ссылаться на один и тот же объект, но свойства этого объекта могут свободно изменяться.

Другими словами, const user выдаст ошибку только в том случае, если мы попытаемся задать user=. в целом.

Тем не менее, если нам действительно нужно создать постоянные свойства объекта, это тоже возможно, но с использованием совершенно других методов. Мы затронем это в главе Флаги и дескрипторы свойств.

Итого

Объекты присваиваются и копируются по ссылке. Другими словами, переменная хранит не «значение объекта», а «ссылку» (адрес в памяти) на это значение. Таким образом, копирование такой переменной или передача её в качестве аргумента функции копирует эту ссылку, а не сам объект.

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

Чтобы создать «реальную копию» (клон), мы можем использовать Object.assign для так называемой «поверхностной копии» (вложенные объекты копируются по ссылке) или функцию «глубокого клонирования», такую как _.cloneDeep(obj).

Копирование объектов в Java

Часто встречается ситуация, когда при программировании на языке Java возникает необходимость создать копию объекта. Примером может служить следующий код:

Person person1 = new Person(); person1.setName("Иван"); Person person2 = person1; person2.setName("Петр"); System.out.println(person1.getName()); // выводит 'Петр'

В этом примере создается объект person1 класса Person , которому присваивается имя «Иван». Затем создается объект person2 , который является копией person1 . Изменение имени person2 на «Петр» приводит к тому, что имя person1 также меняется на «Петр».

Это происходит потому, что в Java при присваивании person2 = person1 копируется не сам объект, а ссылка на него. Это означает, что person1 и person2 указывают на один и тот же объект в памяти. В результате изменения, произведенные через одну переменную, отражаются на объекте, на который указывает другая переменная.

Для создания полноценной копии объекта в Java можно использовать метод clone() . Однако этот метод имеет свои нюансы и может быть не поддержан для некоторых классов. Кроме того, метод clone() создает поверхностную копию объекта, что может быть недостаточно, если объект содержит ссылки на другие объекты.

Более предпочтительным способом копирования объектов в Java является использование конструктора копирования или метода фабрики. Конструктор копирования — это конструктор, который принимает объект того же класса в качестве параметра. Метод фабрики — это статический метод, который принимает объект и возвращает его копию.

Пример использования конструктора копирования:

public class Person < private String name; public Person() < >public Person(Person original) < this.name = original.name; >// остальной код класса >

Пример использования метода фабрики:

public class Person < private String name; public static Person copyOf(Person original) < Person copy = new Person(); copy.name = original.name; return copy; >// остальной код класса >

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Luxury Car Rental in Miami | Reserve a Premium Vehicle with RealCar