Форум: "Прочее";
Текущий архив: 2013.10.06;
Скачать: [xml.tar.bz2];
ВнизНаглядная настройка параметров. Найти похожие ветки
← →
О-Сознание (2013-04-25 13:48) [0]Есть множество классов, но по разному инициализированными свойствами:
type
TEnity = class
constructor Create; virtual;
private
FA: Integer;
FB: Integer;
FC: Integer;
published
property A: Integer read FA;
property B: Integer read FB;
property C: Integer read FC;
end;
TEnity_1 = class (TEnity)
constructor Create; override;
end;
TEnity_2 = class (TEnity)
constructor Create; override;
end;
{ TEnity }
constructor TEnity.Create;
begin
inherited;
FA:= 1;
FB:= 2;
FC:= 3;
end;
{ TEnity_1 }
constructor TEnity_1.Create;
begin
inherited;
FA:= 1;
FB:= 20000;
FC:= -10;
end;
{ TEnity_2 }
constructor TEnity_2.Create;
begin
inherited;
FA:= -10;
FB:= 50;
FC:= 444;
end;
Помимо свойств у каждого есть свои методы и функции ->
В следствии чего теряется быстрота и наглядность изменения известных свойств.
Было бы хорошо инициализировать классы в Config.pas так:
procedure SetParam(TEnity_1, 1, 20000, -10);
procedure SetParam(TEnity_2, -10, 50, 444);
. . .
Как такое оптимальнее сделать?
← →
Eraser © (2013-04-25 14:04) [1]через статические свойства можно.
← →
Компромисс1 © (2013-04-25 14:33) [2]Это точно не константы для каждого класса? А то я write не вижу.
← →
Плохиш © (2013-04-25 14:53) [3]Добавить в TEnity метод SetParam.
← →
O'ShinW © (2013-04-25 14:58) [4]TEnity = class
public
constructor Create(A,B,C: Integer); virtual;
> инициализировать классы в Config.pas так:
C1 := TEnity_1.Create( 1, 20000, -10);
C2 := TEnity_2.Create( -10, 50, 444);
← →
Юрий Зотов © (2013-04-25 15:00) [5]TEnity наследуется от TObject. Тогда какой смысл в published?
← →
Аббат Пиккола (2013-04-25 15:05) [6]Согласен с Юрий Зотов © (25.04.13 15:00) [5]
Published используется, если нужно отображать свойство компонента в инспекторе объектов. В данном случае правильно public.
← →
Компромисс1 © (2013-04-25 15:06) [7]
> Помимо свойств у каждого есть свои методы и функции ->
Кстати, судя по этому фрагменту, напрашивается общий предок, у которого будет A,B,C.
← →
Игорь Шевченко © (2013-04-25 15:15) [8]
> Published используется, если нужно отображать свойство компонента
> в инспекторе объектов
Не совсем для этого :)
← →
Аббат Пиккола (2013-04-25 15:20) [9]Published members have the same visibility as public members. The difference is that runtime type information (RTTI) is generated for published members. RTTI allows an application to query the fields and properties of an object dynamically and to locate its methods. RTTI is used to access the values of properties when saving and loading form files, to display properties in the Object Inspector, and to associate specific methods (called event handlers) with specific properties (called events).
← →
Аббат Пиккола (2013-04-25 15:26) [10]Плюс еще вот это:
Most classes with published members derive from TPersistent
← →
Игорь Шевченко © (2013-04-25 16:52) [11]Аббат Пиккола (25.04.13 15:20) [9]
И какой вывод из этого следует ?
← →
О-Сознание (2013-04-25 18:14) [12]
> Компромисс1 © (25.04.13 14:33) [2]
>
> Это точно не константы для каждого класса? А то я write
> не вижу.
Ах да, там write.
> Юрий Зотов © (25.04.13 15:00) [5]
>
> TEnity наследуется от TObject. Тогда какой смысл в published?
>
Однотипность. :)
> O"ShinW © (25.04.13 14:58) [4]
Хочется сделать так:
E:= TEntity.Create;
Т.е. так, чтобы свойства не устанавливать явно каждый раз.
← →
clickmaker © (2013-04-25 18:26) [13]> Хочется сделать так:
>
> E:= TEntity.Create;
Я бы завел фабрику классов и енум "тип сущности"
← →
Юрий Зотов © (2013-04-25 18:28) [14]
> О-Сознание
Возможно, есть смысл загнать все значения куда-нибудь в единый источник (XML, таблица БД, INI и т.п.). Ключом будет служить имя класса, например:
[TEnity]
A = 1
B = 2
C = 3
[TEnity_1]
A = 1
B = 20000
C = -10
[TEnity_2]
A = -10
B = 50
C = 444
После этого будет достаточно лишь одного конструктора - в базовом классе. Все остальные уже не понадобятся, сколько бы потомков ни было. И при появлении нового потомка надо будет всего лишь добавить секцию (тэг, запись...). IMHO, это удобно.
← →
знайка (2013-04-25 21:20) [15]а для чего все это надо? :)
← →
clickmaker © (2013-04-25 22:01) [16]> знайка (25.04.13 21:20)
наконец-то первый нормальный программерский вопрос :)
← →
О-Сознание (2013-04-25 22:19) [17]
> знайка (25.04.13 21:20) [15]
>
> а для чего все это надо? :)
Для наглядной настройки параметров, название темы само говорит.
Сущностей будет около 30 штук, править, лазая в конструктор не очень удобно. :)
← →
Плохиш © (2013-04-25 22:22) [18]Как всегда. Сначала высосать проблему из пальца, а потом героически её решать.
← →
clickmaker © (2013-04-25 22:42) [19]> Для наглядной настройки параметров, название темы само говорит
Название темы скорей говорит о каком-то гуе для настройки параметров программы. Типа диалоговое окно
← →
О-Сознание (2013-04-25 23:29) [20]
> clickmaker © (25.04.13 22:42) [19]
>
> > Для наглядной настройки параметров, название темы само
> говорит
>
> Название темы скорей говорит о каком-то гуе для настройки
> параметров программы. Типа диалоговое окно
>
> Config.pas
← →
О-Сознание (2013-04-26 10:51) [21]В общем будет как-то так:
function CreateEntity(Kind: LongInt): TEnity;
begin
case of
Result:= TEnity_1.Create(1, 20000, -10);
Result:= TEnity_2.Create(1, 2, 3);
end;
← →
icelex © (2013-04-26 11:25) [22]ну так кто ж мешает использовать фабрики?
← →
О-Сознание (2013-04-26 14:06) [23]Вопрос исчерпан.
← →
han_malign (2013-04-26 15:00) [24]
> case oftype
TEntityChoice = ( Entity1, Entity2, Entity3 );
const defEntity: array[TEntityChoice] of record a, b, c: integer end = (
(a:1 , b:2 , c:3 ),
(a:1 , b:20000, c:-10),
(a:-10, b:50 , c:444)
);
← →
О-Сознание (2013-04-26 15:30) [25]
> han_malign (26.04.13 15:00) [24]
>
>
> > case of
>
> type
> TEntityChoice = ( Entity1, Entity2, Entity3 );
Вот такое пытался сделать, а оно вон как делается.
Спасибо, не знал. :)
← →
Компромисс1 © (2013-04-26 15:34) [26]Map<Class<? extends Entity>, Map<String, Integer>> class2params
:)
← →
О-Сознание (2013-04-26 19:58) [27]
> han_malign (26.04.13 15:00) [24]
>
>
> > case of
>
> type
> TEntityChoice = ( Entity1, Entity2, Entity3 );
Для некоторых классов не могу так сделать,
пишет: "Identifier redeclared". (Нашли двойника)
Т.е. (Условно) TEnity - подходит, TEnity_1 - нет.
Причину не могу найти.
← →
Компромисс1 © (2013-04-27 21:23) [28]Переименуйте. Нельзя, чтобы совпадало с именем класса.
← →
О-Сознание (2013-04-27 22:16) [29]
> Компромисс1 © (27.04.13 21:23) [28]
>
> Переименуйте. Нельзя, чтобы совпадало с именем класса.
А почему TEnity подходит?
← →
Компромисс1 © (2013-04-27 22:44) [30]Я подозреваю, что нельзя, чтобы имя класса совпадало с именем члена перечиляемого типа.
Если после переименования ошибка исчезнет, значит в этом было дело.
← →
Аббат Пиккола (2013-04-28 01:29) [31]Сколько я не взираю на все это, никак в толк не возьму, к чему все это.
Будет 30 классов сущностей, как я понял, каждая сущность будет иметь одни и те же 3 свойства, но с разными значениями. Похоже, что каждой сущности будет создано по одному экземпляру (объекту). Может быть сделать ОДНУ сущность и 30 экземпляров с разными свойствами?
Простите, если что не так, но мне вспомнился Малыш и Карлсон.
А нельзя, чтобы было 30 тортов и одна свечка?
:)
← →
Аббат Пиккола (2013-04-28 12:05) [32]2 О-Сознание
Как по-Вашему, если есть класс TEntity, имеющий свойства A,B,C. И нужно иметь 30 объектов, каждый со своим значением свойств A,B,C, то что нам требуется в конечном итоге иметь:
1. 30 потомков класса TEntity (TEntity1, TEntity2, TEntity3 и т.д.)
2. 30 экземпляров класса TEntity (Entity1, Entity2, Entity3 и т.д.)
3. Без разницы.
?
← →
Аббат Пиккола (2013-04-28 12:24) [33]TEntity - сущность.
Господь сказал "Плодитесь и размножайтесь, но не плодите сущностей без надобности (курсив - прим.ред.:)" (Быт.1:28)
Entia non sunt multiplicanda sine necessitate
Я же пока не вижу никаких различий в потомках класса TEntity, кроме значений их свойств, присваиваемых в момент создания. Для этого достаточно иметь конструктор, принимающий 3 параметра. Или конструктор, принимающий 1 параметр (индекс) и массив значений (const), из которого будут браться эти значения, если они фиксированы.
← →
Компромисс1 © (2013-04-28 13:13) [34]Аббат Пиккола (28.04.13 12:24) [33]
В OP написано про разные методы и свойства
← →
О-Сознание (2013-04-28 14:35) [35]
> Аббат Пиккола (28.04.13 12:05) [32]
>
> 2 О-Сознание
>
> Как по-Вашему, если есть класс TEntity, имеющий свойства
> A,B,C. И нужно иметь 30 объектов, каждый со своим значением
> свойств A,B,C, то что нам требуется в конечном итоге иметь:
>
30 потомков.
У каждого своя реализация поверх обычной сущности, но базовые свойства те же. Вот их надо как-то удобно настраивать.
← →
Плохиш © (2013-04-28 15:44) [36]Хм, за трое суток каких только отверстий не предложили для вырезания гланд.
← →
Eraser © (2013-04-28 21:56) [37]
> Плохиш © (28.04.13 15:44) [36]
автору просто надо к окулисту.
← →
О-Сознание (2013-04-28 22:41) [38]
> Плохиш © (28.04.13 15:44) [36]
> Eraser © (28.04.13 21:56) [37]
Это вам надо к окулисту, дорогие мои.
Вопрос давно решён.
> О-Сознание (26.04.13 14:06) [23]
> Вопрос исчерпан.
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2013.10.06;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.006 c