• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

Наследование

  • Автор темы Mun2
  • Дата начала
M

Mun2

Здравствуйте!
у меня такой вопрос возник:

описывается класс
TParentClass = Class
fa: double;
...
end;

можно ли все классы ,порожденные от него, например,

TClass1 = Class(TParentClass)
//fa: String;
...
end;

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

т.е. своего рода аналог применения VIRTUAL; Abstract; но только не для методов, а полей объекта?
 
M

Mun2

А что Variant не походит ?

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

проблема в том, чтобы объявить в родителе какие-то поля, не важно какого типа, чтобы они ОБЯЗАТЕЛЬНО были перегружены(переопределены) в потомках.
 
V

vital

Ну так.. Переопределяйте в потомках и добавляйте директиву Overload, которая для этого и придумана и, если я вас правильно понял, будет вам счастье)
 
M

Mun2

Ну так.. Переопределяйте в потомках и добавляйте директиву Overload, которая для этого и придумана и, если я вас правильно понял, будет вам счастье)

TParentClass = Class
fa: double;
...
end;

TClass1 = Class(TParentClass)
fa: String;
...
end;

будет ли)
поля перегружаются и без Overload.
проблема в том, что в потомке это поле может быть не объявлено вовсе.
задача: вынудить разработчика переопределить тип каждого поля, объявленного в родителе.
возможно ли такое вовсе?
 
V

vital

Дурная затея какая-то. Ведь наследование для того и придумано, что бы использовать старый функционал, добавляя к нему новый. А у вас получается вроде как наследование, но при этом, писать нужно все-равно все заново.. Бред какой-то)
 
M

Mun2

Дурная затея какая-то. Ведь наследование для того и придумано, что бы использовать старый функционал, добавляя к нему новый. А у вас получается вроде как наследование, но при этом, писать нужно все-равно все заново.. Бред какой-то)

верю) потому и спросил вовсе реализуемо ли это.
здесь идея наследования заключается лишь только в объявлении переменных.
попробую поменять идею, раз уж она так похожа на бред <_<

А что Variant не походит ?

Variant работает только с родными типами?
 
Z

zubr

Сделай родительский класс таким:
Код:
TTest = class
private
FPole: string;
protected
function GetPole: variant; virtual; abstract;
procedure SetPole(value: variant); virtual; abstract;
property pole: variant read GetPole write SetPole;
end;
Тогда разработчик в наследуемом классе будет вынужден переопределять методы Get, Set - иначе у него будет Abstract error выскакивать.
 
M

Mun2

Сделай родительский класс таким:
Код:
TTest = class
private
FPole: string;
protected
function GetPole: variant; virtual; abstract;
procedure SetPole(value: variant); virtual; abstract;
property pole: variant read GetPole write SetPole;
end;
Тогда разработчик в наследуемом классе будет вынужден переопределять методы Get, Set - иначе у него будет Abstract error выскакивать.

у меня потомка к TTest компилит без вопросов :unsure:

Код:
type
TTestChild = class (TTest)
procedure some;
end;

implementation
procedure TTestChild.Some;
begin

end;
 
V

vital

Компилить оно будет. При использовании будет ошибка.. Или нет?
 
T

Titan

Variant работает только с родными типами?
Variant types

Sometimes it is necessary to manipulate data whose type varies or cannot be determined at compile time. In these cases, one option is to use variables and parameters of type Variant, which represent values that can change type at runtime. Variants offer greater flexibility but consume more memory than regular variables, and operations on them are slower than on statically bound types. Moreover, illicit operations on variants often result in runtime errors, where similar mistakes with regular variables would have been caught at compile time. You can also create custom variant types.

By default, Variants can hold values of any type except records, sets, static arrays, files, classes, class references, and pointers. In other words, variants can hold anything but structured types and pointers. They can hold interfaces, whose methods and properties can be accessed through them. (See Object interfaces.) They can hold dynamic arrays, and they can hold a special kind of static array called a variant array. (See Variant arrays.) Variants can mix with other variants and with integer, real, string, and Boolean values in expressions and assignments; the compiler automatically performs type conversions.
 
M

Mun2

Компилить оно будет. При использовании будет ошибка.. Или нет?

добавил

Код:
 private
FPole: string;
protected
function GetPole: variant; virtual; abstract;
procedure SetPole(value: variant); virtual; abstract;
property pole: variant read GetPole write SetPole;

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

zubr

Mun2
ну а теперь попробуй создать класс-потомок, затем создай объект класса-потомка и обратись в программе к свойству pole
 
M

Mun2

Variant types

Sometimes it is necessary to manipulate data whose type varies or cannot be determined at compile time. In these cases, one option is to use variables and parameters of type Variant, which represent values that can change type at runtime. Variants offer greater flexibility but consume more memory than regular variables, and operations on them are slower than on statically bound types. Moreover, illicit operations on variants often result in runtime errors, where similar mistakes with regular variables would have been caught at compile time. You can also create custom variant types.

By default, Variants can hold values of any type except records, sets, static arrays, files, classes, class references, and pointers. In other words, variants can hold anything but structured types and pointers. They can hold interfaces, whose methods and properties can be accessed through them. (See Object interfaces.) They can hold dynamic arrays, and they can hold a special kind of static array called a variant array. (See Variant arrays.) Variants can mix with other variants and with integer, real, string, and Boolean values in expressions and assignments; the compiler automatically performs type conversions.


спасибо! :)

Mun2
ну а теперь попробуй создать класс-потомок, затем создай объект класса-потомка и обратись в программе к свойству pole

интересный подход :) спасибо :(
 
M

Mun2

Дурная затея какая-то. Ведь наследование для того и придумано, что бы использовать старый функционал, добавляя к нему новый. А у вас получается вроде как наследование, но при этом, писать нужно все-равно все заново.. Бред какой-то)

быть может в такой ситуации применение интерфейса будет более оптимально?
иль класс только реализует интерфейс, а не наследует его?
 
V

vital

Мне вот самому интересно что скажет zubr..)
 
Z

zubr

Можно и интерфейс использовать, только тогда в классе-наследнике придется обязательно реализацию интерфейсных методов писать или заглушки.
 
M

Mun2

Интерфейс с обязыванием реализации методов в классе аналогичен классу с (virtual; abstract;) методами.
Но интерфейс не обязывает объявленные в себе свойства ввести в реализующем классе.
А основная моя проблема заключалась в этом.

Код:
 ITest = interface
procedure proc1;
function GetStringProp: String;
property Prop: String Read GetStringProp;
end;

TTest = class (TInterfacedObject, ITest)
FField1: String;
private
function GetProp: String;
procedure proc2;
function GetStringProp: String;
//	function GetIntProp: Integer;
procedure proc1;
//	property Prop: Integer Read GetIntProp;
end;

такой код компилится без претензий по поводу свойства Prop в классе

Т.е. применение интерфейса в данном случае не лучше и не хуже применения описанного выше "zubr"ом способа с описанием (virtual; abstract;) методов для чтения и записи свойства.
 
E

etc

Ерундой вы занимаетесь, вам надо с архитектурой что-то делать. а вы костыли придумываете.
 
E

etc

Mun2 сказал(а):
что-нибудь посоветовать можете о том, в каком русле думать?
Можно и посоветовать, только пока непонятно, что вы делаете. А из того что тут написано, ясно одно - архитектура неправильная.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!