4 / 4 / 3
Регистрация: 15.12.2012
Сообщений: 192
1

Проверить являются члены множества классов потомками другого множества классов

06.02.2016, 16:19. Показов 3127. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Как проверить являются ли члены множества классов потомками другого множества классов
Например, есть четыре множества, являющиеся потомками первого из них:
Delphi
1
2
3
4
Array1: array of TClass1; //корневой класс
Array2: array of TClass2; //потомок класса TClass1
Array3: array of TClass3; //потомок класса TClass1
Array4: array of TClass4; //потомок класса TClass1
Мне нужно сделать процедуру, которая бы действовала в зависимости от класса элементов данных массивов.
Вот как я представлял:
Delphi
1
2
3
4
5
6
7
8
9
procedure WriteClass(Sender: array of TClass1);
begin
 if Sender is TClass2 then
  TClass2.draw1;
 if Sender is TClass3 then
  TClass3.draw2;
 if Sender is TClass4 then
  TClass4.draw3;
end;
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.02.2016, 16:19
Ответы с готовыми решениями:

Обработка множества объектов разных классов
Кратенько исходная задача: имеется железо в режиме TX, которое периодически выдает сообщения о...

Реализация шаблона множества set (для классов) на основе list или указателей
Требуется реализовать шаблон <set>, только на основе списка или указателей, чтобы там былии методы...

Возможно ли создание собственного пространства имен для объединения множества классов и типов
Возможно ли создание собственного пространства имен для объединения множества классов и типов. Либо...

Как в множестве set проверить наличие элементов другого множества?
while (!fin.eof()) { fin >> word; cout<< word<<endl; for (int i = 0; i < kol_ar;...

17
5841 / 4573 / 1443
Регистрация: 14.04.2014
Сообщений: 20,310
Записей в блоге: 20
06.02.2016, 18:23 2
лучше объясни исходную задачу
скорее всего выбран неправильный метод решения

Добавлено через 29 секунд
да и вопрос про множества
а в тексте - массивы
0
139 / 137 / 66
Регистрация: 15.05.2012
Сообщений: 515
07.02.2016, 02:23 3
Проверка классов потомков:
Delphi
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
type
  TBaseClass = class // основной
    private
    protected
    public
 
  end;
 
type
  TChildBaseClass = class (TBaseClass) // наследник от базового
    private
    protected
    public
  end;
 
type
  TLeftClass = class // "левый класс"
    private
    protected
    public
  end;
 
{.................}
 
var
  ChildBaseClass: TChildBaseClass;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  ChildBaseClass:= TChildBaseClass.Create;
end;
 
// проверка. является ли класс потомком
procedure CheckClass(child: TObject; parent: TClass);
begin
  if child.InheritsFrom(parent) then
    ShowMessage(Format('Child class %s belongs to parent class %s', [child.ClassName, parent.ClassName]))
  else
    ShowMessage(Format('Child class %s not belongs to parent class %s', [child.ClassName, parent.ClassName]))
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  CheckClass(ChildBaseClass, TBaseClass); // является
  CheckClass(ChildBaseClass, TLeftClass); // не является
end;
Добавлено через 4 минуты
Цитата Сообщение от homelleon Посмотреть сообщение
Как проверить являются ли члены множества классов потомками другого множества классов
вперемешку, Delphi и С++ учите... ))
1
4 / 4 / 3
Регистрация: 15.12.2012
Сообщений: 192
07.02.2016, 08:52  [ТС] 4
Не понял про вперемешку.
Мне нужно сравнить тип элементов одного массива с другим и потом выполнить с этим массивом классовые методы (элементы массива - объекты класса.
0
5841 / 4573 / 1443
Регистрация: 14.04.2014
Сообщений: 20,310
Записей в блоге: 20
07.02.2016, 09:51 5
вот и говорю, представьте исходную задачу
выглядит ровно настолько экзотично, что есть подозрение на изобретение велосипеда с квадратными колесами
0
4 / 4 / 3
Регистрация: 15.12.2012
Сообщений: 192
07.02.2016, 10:46  [ТС] 6
Не знаю ничего про колеса, но моя программа должна создавать графические объекты на экране. Есть класс объект, есть класс квадрат и куб. У них повторяются действия. Чтобы не тратить силы, я объявил массивы этих классов в виде переменных. Нужно их сначала создать, потом настроить, нарисовать и удалить из памяти. Эти действия повторяются, но разнятся содержание. Для меньшего количества записей я хотел сделать одну процедуру на каждое действие, где входным параметром мог становится любой из объявленных массивов, только меняются данные и виды операции, в зависимости от класса элементов массива.
0
5841 / 4573 / 1443
Регистрация: 14.04.2014
Сообщений: 20,310
Записей в блоге: 20
07.02.2016, 21:38 7
ну вот что-то подобное я и предполагал
но при чем тут классы?
создаются экземпляры объектов описанных классов
и все встает на свои места

есть объекты, есть списки этих объектов
есть некий суперобъект, который по списку рисует графические элемены в зависимости от их класса

есть много всяких рассуждений в том числе на этом форуме
но из своего большого практического опыта я выделил этот вариант как самый верный
с точки зрения ООП и разделения функциональности по модулям:

объекты хранят данные и ничего не знают о своей отрисовке
суперобъект знает все о масштабе и поле рисования, имеет доступ к канвасу и т.д.
и тогда есть большой цикл с ветвлением, где перечислены все виды используемых примитивов
Delphi
1
2
3
4
5
6
7
8
9
10
11
obj:=MyObjects[i];
if obj is TMyRect then
begin
...
end else if obj is TMyCircle then
begin
...
end else if obj is TMyStar then
begin
...
end
а чаще всего еще более сложное что-то, с учетом группировки объектов, слоев видимости и т.д.

и никаких Array of TClass
0
4 / 4 / 3
Регистрация: 15.12.2012
Сообщений: 192
07.02.2016, 23:59  [ТС] 8
Создание объектов класса я тоже хочу передать процедуре. Мне нужен массив объектов класса, чтобы создавать подобные объекты в большом количестве, поэтому массив с таким типом.
0
5841 / 4573 / 1443
Регистрация: 14.04.2014
Сообщений: 20,310
Записей в блоге: 20
08.02.2016, 06:06 9
в 21 веке "массив" объектов выглядит так

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
TMyGraphObject=class
...
end;
TMyRect=class(TMyGraphObject)
...
end;
TMyEllipse=class(TMyGraphObject)
...
end;
 
TMyGraphObjects=class(TObjectList<TMyGraphObject>)
...
end;
0
4 / 4 / 3
Регистрация: 15.12.2012
Сообщений: 192
08.02.2016, 10:10  [ТС] 10
Это список классов, а не массив объектов. Мне нужно именно массив объектов. Он объявляется вот так:
Delphi
1
2
3
4
5
6
7
Var
 i:integer;
 Mass: array of TClass;
Begin
For i:=1 to 10 do
Mass[i]:= TClass.create;
End;
0
5841 / 4573 / 1443
Регистрация: 14.04.2014
Сообщений: 20,310
Записей в блоге: 20
08.02.2016, 10:36 11
1.Забудьте же, наконец, про массивы. Считайте что списки - это динамические массивы с расширенной функциональностью...

2.Что даст вам создание по очереди прямоугольника вообще, квадрата вообще, круга вообще?
не какого-то конкретного, а абсолютно пустого, который вы так ловко можете создать, правда не так как у вас тут написано, а, например mass[i]:=ClassArray[i].Create;

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

Delphi
1
2
3
4
5
6
7
var
  objList:TMyGraphObjects.Create(true);
 
r:=TMyRect.Create;
r.SetBounds(x,y,w,h);
objList.Add(r);
...
1
4 / 4 / 3
Регистрация: 15.12.2012
Сообщений: 192
08.02.2016, 14:29  [ТС] 12
Я не совсем понял, но уже начинаю понимать... хорошо, тогда поучу списки вместо массивов.

Добавлено через 1 час 46 минут
Цитата Сообщение от krapotkin Посмотреть сообщение
TMyGraphObjects=class(TObjectList<TMyGraphObject>) ... end;
Что такое TObjectList?
0
5841 / 4573 / 1443
Регистрация: 14.04.2014
Сообщений: 20,310
Записей в блоге: 20
08.02.2016, 15:45 13
мне сложно понять, почему бы не
0
4 / 4 / 3
Регистрация: 15.12.2012
Сообщений: 192
08.02.2016, 16:00  [ТС] 14
Я почти разобрался со списками.
Пояснение по след. кодам:
TCube и TQuad - потомки TObj
QuadCount и CubeCount - константы

Delphi
1
2
3
4
5
6
7
8
type
  TObjects = class (TObjectList)
  private
    function GetItems(Index: Integer): TObj;
    procedure SetItems(Index: Integer; const Value: TObj);
  public
   property Items[Index: Integer]: TObj read GetItems write SetItems; default;
  end;
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var
 Quad: TOQuad;
 Cube: TOCube;
 Objects: TObjects;
begin
 Objects:=TObjects.Create(true);
  for i := 0 to QuadCount - 1 do
  begin
   Quad:=TOQuad.Create('Квадрат '+IntToStr(i));  //-Квадраты-
   Objects.Add(Quad);
  end;
  for i := 0 to CubeCount-1 do
  begin
   Cube:=TOCube.Create('Куб '+IntToStr(i));      //-Кубы
   Objects.Add(Cube);
  end;
Delphi
1
2
3
4
5
6
7
8
9
10
for i := 0 to QuadCount-1 do
   begin
    with Objects.<<объект с классом TQuad??> do
    begin
     Move(-4+2*i,0,0);
     MaterialLibrary:=ML;
     SetTexture('ДеревоЯщик');
     Textured:= true;
    end;
   end;
Вопрос:
Есть ли возможность выбрать из списка объекты только с классом TQuad?
0
5841 / 4573 / 1443
Регистрация: 14.04.2014
Сообщений: 20,310
Записей в блоге: 20
08.02.2016, 21:40 15
Лучший ответ Сообщение было отмечено homelleon как решение

Решение

отлично...
вполне достаточно будет
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
var cb:TCube;
 
for i:=0 to quad.count-1 do
begin
  if (quad[i] is TCube) then
  begin
    cb:=quad[i] as TCube;
    // использовать cb, чтобы не лазить постоянно Quad[i].
    // Delphi почему-то не оптимизирует обращение к i-му элементу
   ...
  end;
end;
Добавлено через 6 минут
в качестве примера у меня в аналогичной задаче есть примерно такой код
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
TGrKind=(kLine,kPoint,kSegment);
TGrKindSet=set of TGrKind;
TGrObject=class
  kind:TGrKind;
end;
TGrObjects=class(TObjectList<TGrKind>)
  function SubSet(Kinds:TGrKindSet):TGrObjects;
end;
 
function TGrObjects.SubSet(Kinds:TGrKindSet):TGrObjects;
begin
  result := TGrObjects.Create(False);
  for i:=0 to Count-1 do
  begin
     if (items[i].kind in Kinds) then
       result.add(Items[i]);
  end;
end;
 
// использовать очень просто
List1:=objList.Subset([kLine,kPoint];
LineList:=objList.Subset([kline]);
1
4 / 4 / 3
Регистрация: 15.12.2012
Сообщений: 192
08.02.2016, 21:46  [ТС] 16
Просто у меня программа ругалась, что
quad[i] и TCube - не совместимы, т.к. quad[i] - TObj (тот класс, который я указывал в списке на SetItems и другой похожий, т.к. TObj - это родительский класс для TCube), хотя в [i] записан TCube.
0
5841 / 4573 / 1443
Регистрация: 14.04.2014
Сообщений: 20,310
Записей в блоге: 20
08.02.2016, 21:57 17
Лучший ответ Сообщение было отмечено homelleon как решение

Решение

конечно
используйте конструкцию as
var obj:TClass1;
(obj as TClass2) приведение типа с автоматической проверкой наследования

если TClass2 наследник TClass1 - то все будет ОК
1
4 / 4 / 3
Регистрация: 15.12.2012
Сообщений: 192
08.02.2016, 21:59  [ТС] 18
Ясно! Спасибо.
Я на время отказался, правда, от общего списка, сделал списки для каждого объекта - но тоже удобно.
0
08.02.2016, 21:59
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.02.2016, 21:59
Помогаю со студенческими работами здесь

Вывести слова этого же текста, множества символов которых являются подмножествами множества символов
Для каждого слова w данного текста вывести слова этого же текста, множества символов которых...

Определить количество классов эквивалентных столбцов данной прямоугольной матрицы. Столбцы считать эквивалентными, если равны множества их элементов.
подскажите пожалуйста!!!на СИ Определить количество классов эквивалентных столбцов данной...

Static члены классов
Доббрый день. Хочу решить следующую задачу: посчитать количество сравнений, которое делает...

Указатель на объекты и члены классов
class AA { public: void Start( ); }; class BB { public: void Start( );


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru