CyberForum.ru - Форум программистов и сисадминов
Вернуться   Форум программистов и сисадминов CyberForum.ru > Форум программистов > Форум Delphi

Ответ Создать новую тему
 
Старый 23.01.2012, 08:59   #1
DedBoroda
Джедай
 
Аватар для DedBoroda
 
Регистрация: 04.11.2010
Адрес: Москва
Сообщений: 378
Репутация: 74 (74)
Счастье Поиск класса по имени

Всем доброго времени суток.

Помогите, пожалуйста, решить одну проблему.

У меня есть класс TMyClass и куча различных потомков TMyClass1, TMyClass2,...,TMyClassN.
У TMyClass есть поле objtype:TMyType ( TMyType = (class1,class2,...,classN) ). У потомков есть поля-массивы с различной размерностью но одинаковым именем(Props).

У меня есть указатель на неизвестный экземпляр класса, один из выше упомянутых.


Как можно получить досуп к полю-массиву с нужной размерностью без использования case objtype?

Абстрактное решение:

Код Delphi
1
2
3
4
5
6
7
8
9
10
11
12
var p : pointer;
 
begin
//случай, когда знаем нужный класс
p := @MyObject1;
showmessage(High(MyClass1(p).Props)); //допустим будет 5
 
//случай, когда нужно получить нужный массив со знанием имени класса,
//типизируем его по имени класса или как-то еще, кароче вопрос именно в этом
p := @MyObject1;
showmessage(High([TMyClass(p).objtype](p).Props)); //тоже должно получится 5
end.
Помимо всего прочего, таким же образом требуется получать доступ к методам классов(Create, AddProp и т.д.)

У кого есть мысли?
DedBoroda вне форума
Другие темы раздела
Delphi Написание программы редактора
Доброе время суток пользователи форума, мне нужна помощь в написание программы (редактора) файла, структуры файла у меня есть, сам я еще плохо разбираюсь в delphi если у кого есть время помогите пожалуйста, связаться со мной можно *** или скайп *** .ink, если желающих не найдётся, то переноси.... Написание программы редактора
Написать прогу используя запись и масивы Delphi
Написать прогу в которую сначало нужно будет ввести данные: ФИО, пол, год рождения, оклад. И чтобы можно было осуществлять поиск сотрудников по однаму пораметру,например ФИО.. Написать прогу используя запись и масивы
Старый 03.02.2012, 14:23  [ТС]   #11
DedBoroda
Джедай
 
Аватар для DedBoroda
 
Регистрация: 04.11.2010
Адрес: Москва
Сообщений: 378
Репутация: 74 (74)
По умолчанию Re: Поиск класса по имени

Продолжу немного сабж ООП

Есть ли в дельфи возможность перекрыть виртуальный метод, но не описывать его в потомке? Код метода один, но он работает с динамическими данными каждого потомка по разному. Есть ли вариант не копипастить этот метод по всем потомкам?
DedBoroda вне форума
Старый 03.02.2012, 14:31   #12
Mawrat
Модератор
 
Регистрация: 19.09.2009
Адрес: г. Самара
Сообщений: 5,104
Репутация: 7196 (3078)
По умолчанию Re: Поиск класса по имени

Предположим, мы имеем базовый абстрактный класс. В этом классе есть абстрактный метод. И мы хотим создать несколько классов потомков, в которых реализация этого метода одинаковая. В этом случае можно поступить так - создаём потомка от базового класса (этот потомок тоже может быть абстрактным). И в этом потомке реализуем интересующий метод. А потом все другие классы наследуем от этого потомка.
Mawrat вне форума
Старый 03.02.2012, 14:50  [ТС]   #13
DedBoroda
Джедай
 
Аватар для DedBoroda
 
Регистрация: 04.11.2010
Адрес: Москва
Сообщений: 378
Репутация: 74 (74)
По умолчанию Re: Поиск класса по имени

Цитата Сообщение от Mawrat Посмотреть сообщение
Предположим, мы имеем базовый абстрактный класс. В этом классе есть абстрактный метод. И мы хотим создать несколько классов потомков, в которых реализация этого метода одинаковая. В этом случае можно поступить так - создаём потомка от базового класса (этот потомок тоже может быть абстрактным). И в этом потомке реализуем интересующий метод. А потом все другие классы наследуем от этого потомка.
Понятно, сейчас попробую и отпишусь

Добавлено через 10 минут
Не получилось. Или я неправильно Вас понял:
Код 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
47
48
49
50
51
52
53
54
55
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;
 
type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
 
 
type TBase =  class abstract
    procedure myproc;virtual;abstract;
  end;
     TC1 = class(TBase)
      text:string;
      procedure myproc;override;
     end;
 
     TC2 = class(TC1)
      text:string[2];
     end;
 
 
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TC1.myproc;
begin
showmessage(text);
end;
 
procedure TForm1.FormCreate(Sender: TObject);
var p : TC2;
begin
p := TC2.Create;
p.text := '11';
p.myproc;
end;
 
end.
 
DedBoroda вне форума
Старый 03.02.2012, 15:02   #14
Mawrat
Модератор
 
Регистрация: 19.09.2009
Адрес: г. Самара
Сообщений: 5,104
Репутация: 7196 (3078)
По умолчанию Re: Поиск класса по имени

DedBoroda, когда в потомке объявляется новое поле, одноимённое с каким-то другим полем, объявленном в предках этого класса, то, на самом деле, прежнее поле не пропадает. И все методы которые к нему обращались, так и продолжают работать именно со старым полем.
Поэтому, чтобы эту проблему решить, надо доступ к нужному полю организовать через метод. И если в потомках надо брать данные уже из другого поля, то просто надо перекрыть этот метод и прописать там, собственно, чтение из нового поля.
Mawrat вне форума
Старый 03.02.2012, 15:16  [ТС]   #15
DedBoroda
Джедай
 
Аватар для DedBoroda
 
Регистрация: 04.11.2010
Адрес: Москва
Сообщений: 378
Репутация: 74 (74)
По умолчанию Re: Поиск класса по имени

Цитата Сообщение от Mawrat Посмотреть сообщение
Поэтому, чтобы эту проблему решить, надо доступ к нужному полю организовать через метод.
Что частично решит проблему, т.к. придется всё равно в каждом потомке перекрывать метод доступа к полю и этот метод(в моем случае) тоже получается везде одинаковый. Опять копипаст, но объем кода меньше, если не считать еще один промежуточный класс TC1. Я правильно понял?
DedBoroda вне форума
После регистрации реклама в сообщениях будет скрыта
Старый 03.02.2012, 15:20   #16
Mawrat
Модератор
 
Регистрация: 19.09.2009
Адрес: г. Самара
Сообщений: 5,104
Репутация: 7196 (3078)
По умолчанию Re: Поиск класса по имени

В общем, реализовать можно так:
Код 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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
 
type
  TBase =  class
    procedure myproc;virtual;abstract;
  end;
 
  TC1 = class(TBase)
  private
    FText1 : String;
  protected
    procedure SetText(const aText : String); virtual;
    function GetText : String; virtual;
  public
    procedure myproc; override;
    property Text : String read GetText write SetText;
  end;
 
  TC2 = class(TC1)
  private
    FText2 : String;
  protected
    procedure SetText(const aText : String); override;
    function GetText : String; override;
  end;
 
{ TC1 }
 
procedure TC1.SetText(const aText : String);
begin
  FText1 := aText;
end;
 
function TC1.GetText : String;
begin
  Result := FText1;
end;
 
procedure TC1.myproc;
begin
  showmessage(Text);
end;
 
{ TC1 }
 
procedure TC2.SetText(const aText: String);
begin
  FText2 := aText;
end;
 
function TC2.GetText: String;
begin
  Result := FText2;
end;
 
{ TForm1 }
 
procedure TForm1.Button1Click(Sender: TObject);
var
  p : TC2;
begin
  p := TC2.Create;
  p.text := '11';
  p.myproc;
  FreeAndNil(p);
end;
 
Здесь у класса TC1 есть свойство Text. Потомок TC2 наследует это свойство от TC1. Но в TC2 реализованы новые методы работающие с этим свойством. И эти методы теперь возвращают данные другого поля - FText2.
При этом, класс TC2 унаследует от класса TC1 метод myproc(). И этот метод не придётся переписывать - он также будет работать со свойством Text, но это свойство у него даёт доступ к другим данным, нежели в классе TC1.
Mawrat вне форума
Ответ Создать новую тему

Похожие темы
Тема Автор
Delphi для начинающих Найти окно, зная часть имени его класса
Привет всем! Как найти Handle дочерное окно зная его имя('stop , please stop , don't leave'); а класс нет , класс и имя родительское окна неизвестны! Заранее спасибо! Добавлено через 7 часов 47 минут nu , kto pomojet?
MultiVan
C# .NET Как создать объект по имени класса?
У меня имеется переменная в которой хранится имя класса, как мне по этой переменной создать объект этого класса? (конечно без использования if и case).
riksking
Java Получение значения атрибута класса по его имени
Здравствуйте. Допустим у меня есть объект: Object MyObj; И допустим я точно знаю что значение объекта - элемент одного из трех классов. Также точно известно, что каждый из этих трех классов обязательно имеет три атрибута: int pole1, pole2, pole3;
Novichok_80
.NET Получение Класса по имени
Как получить класс имея его имя в переменной? ухитрился найти такое Dim s = Activator.CreateInstanceFrom('путь.dll', 'класс') думал, мож объявить его надо: Dim s = new Activator.... а,не получается. дает ошибку только public sub New срабатывает в нем.
dnv
Базы данных Перехват имени класса
Как перехватить имя класса апликухи в Windows? Например при запуске моей программы, нужно убить все открытые до этого Excel`ы.Говорят что под С++ есть инструмент позволяющий это сделать, а как перехватить из под VB? Я делал так, запускал Excel , с помощью WinApi перехватывал имя окна и пробовал...
Nexus_6
Опции темы

Текущее время: 01:35. Часовой пояс GMT +4.

Компьютерный форум программистов и сисадминов
Powered by vBulletin® Version 3.8.7 PL2
Copyright ©2000 - 2012, vBulletin Solutions, Inc.
Рейтинг@Mail.ru Яндекс.Метрика