![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Чтение свойства - всем, запись - только потомкам
Aldor © (2005-05-29 10:03:00)т.е. сделать что-то типа такого:
TMyClass = class
protected
property Some: TSomeType write SetSome
public
property Some: TSomeType read GetSome
Что обычно делают в таком случае? Просто добавить в protected метод SetXXX - теряется удобство пользования свойствами.
TUser (2005-05-30 10:40:00) [1]Написать protected метод, который умеет присваивать занчение.
Anatoly Podgoretsky (2005-05-30 10:28:00) [2]evvcom © (30.05.05 10:09) [16]
Вообще то он не написал, какого типа у него свойство/поле. Во вторых то, что он написал противоречит его постановке!
Ну а в третьих надо делать именно так как ты написал, работать именно с FSome
Fay (2005-05-30 10:18:00) [3]evvcom © (30.05.05 10:09) [16]
Sorry 8)
evvcom (2005-05-30 10:09:00) [4]
> Inc с пропертёй не пашет.
Естественно. А я и написал Inc( FSome).
> будет работать на гораздо большем количестве типов, в отличии
> от INC.
Ну вобщем да. Но учитывая, как написал автор (Some := Some + 1), с большинством таких типов работать будет.
Anatoly Podgoretsky (2005-05-30 10:03:00) [5]evvcom © (30.05.05 09:52) [13]
Вопрос спорный, в большинстве случаев будет одинаковый код, кроме тех случаев, когда компилятор обругает за недопустимость данной операции, а вот насчет наглядности можно подискутировать. И конструкция X := X + 1; будет работать на гораздо большем количестве типов, в отличии от INC.
Fay (2005-05-30 10:02:00) [6]evvcom © (30.05.05 9:52) [13]
Inc с пропертёй не пашет. Это называется "без потери "удобства"" ?
evvcom (2005-05-30 09:52:00) [7]
> Some := Some + 1, например.
Это оптимальнее заменить на Inc(FSome) без потери "удобства"
Marser (2005-05-29 20:30:00) [8]
> Aldor © (29.05.05 20:16) [11]
Да, блин... И Knight на днях попал...
Aldor (2005-05-29 20:16:00) [9]Да, видимо придется оставить процедуру setter'а, все равно "удобство пользования свойствами" теряется.
Просто думал, что можно осуществить то, что я написал в [7]. Ну да ладно.
P.S. Сорри за сумбурность последнего поста - толкко что после автоаварии, блин. Живой, все ок :)
Marser (2005-05-29 16:05:00) [10]
> Юрий Зотов © (29.05.05 15:24) [9]
В [0] такой вариант отвергается.
Юрий Зотов (2005-05-29 15:24:00) [11]> Aldor © (29.05.05 10:03)
Вот простейший вариант:
type
TMyClass = class
protected
procedure SetSome(Value: ...);
public
function Some: ...;
end;
Anatoly Podgoretsky (2005-05-29 11:25:00) [12]ReadProp и WriteProp
У тебя по постановке по сути два свойства.
Aldor (2005-05-29 11:21:00) [13]
Anatoly Podgoretsky © (29.05.05 11:11) [5]
Зачем тебе именно одинаковые имена.
Some := Some + 1, например.
Идея Ваша, конечно, хорошая, только вот не могу придумать названия для свойства-дубликата, чтобы это было корректно и понятно читающему.
Aldor (2005-05-29 11:16:00) [14]
AlterEgo of WondeRu © (29.05.05 10:46) [4]
сделай SetSome виртуальным... в предке оставь метод пустым, а в потомке сделай реализацию... Даже если в предке будут чего-нить писать, все равно будет выполняться пустой метод
Так все равно же при позднем связыании вызов метода приведет к вызову метода потомка. Тем более важно, чтобы "снаружи" не было даже "видно" метода изменения поля.
Дело ведь не в том, чтобы предок не мог изменить свойство, а чтобы можно было изменять свойство только внутри методов класса, а не "снаружи".
Anatoly Podgoretsky (2005-05-29 11:11:00) [15]Зачем тебе именно одинаковые имена.
AlterEgo of WondeRu (2005-05-29 10:46:00) [16]сделай SetSome виртуальным... в предке оставь метод пустым, а в потомке сделай реализацию... Даже если в предке будут чего-нить писать, все равно будет выполняться пустой метод
Aldor (2005-05-29 10:32:00) [17]Marser
Имеещь в виду проверять self? А смысл? Вызвать-то метод может кто угодно, не вводить же Sender: TObject.
Alex Konshin (2005-05-29 10:26:00) [18]На родство кого к кому? Подумай.
Marser (2005-05-29 10:06:00) [19]В методах write делать проверку на "родство". Не потомок - налево. Можно с exception.