Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.09.12;
Скачать: [xml.tar.bz2];

Вниз

Property в ООП   Найти похожие ветки 

 
Jus   (2004-08-24 19:14) [0]

Помогите мне понять как работает Property ,для тех кто знает в книжках всё понятно, а я немогу разобраться. Как оно работает? покажите на примере если не трудно, пожалуйста!{:(


 
Anatoly Podgoretsky ©   (2004-08-24 19:20) [1]

Property это абстрация, внешне выглядит как переменна, а может являться чем угодно, правила доступа к значению задаются модификаторами Read/Write, что позволяет контролировать достуа. Наиболее частый случай это

Property: type read Field write Field

компилятор заменяет это на обращении к полю, в зависимости от выражения.


 
Суслик ©   (2004-08-24 19:26) [2]

ага, а так он поймет конечно лучше: "абстракция", "модификаторы" и т.д. :))


 
Jus   (2004-08-24 19:29) [3]

Суслик ©

Да пойму, я ж читал про них.

Anatoly Podgoretsky ©

А как оращаться к этому свойству то?


 
Ega23 ©   (2004-08-24 19:37) [4]

Есть хороший пример.
Допустим, ты хочешь создать свой класс, который характеризует точку на плоскости (никогда не создавай, т.к. есть тип TPoint  :о) ).

Пишем:

type
TMyPoint=class
 public
  X:Integer;
  Y:Integer;
 end;


Описав такой класс, ты можешь сделать следующее:

var
pt:TMyPoint
begin
pt:=TMyPoint.Create;
try
 pt.X:=6;
 pt.Y:=8;
 ......
finally
 pt.Free;
end;
end;


Но обращаться напрямую к полям класса не есть хорошо (почему - позже).
Тогда делаем так:

type
TMyPoint=class
 private
  FX:Integer;
  FY:Integer;
 public
  property X:Integer Read FX Write FX;
  property Y:Integer Read FY Write FY;
 end;


В коде обращения к классу ничего не изменится:

var
pt:TMyPoint
begin
pt:=TMyPoint.Create;
try
 pt.X:=6;
 pt.Y:=8;
 ......
finally
 pt.Free;
end;

Теперь, предположим, что нам нужен класс, который характеризует собой окружность. Для описания окружности требуются 3 поля : X, Y и R - радиус.

Пишем:

type
TMyCircle=class
 private
  FX:Integer;
  FY:Integer;
  FR:Integer;
 public
  property X:Integer Read FX Write FX;
  property Y:Integer Read FY Write FY;
  property R:Integer Read FR Write FR;
 end;


А в обращении к этому классу делаем следующее:


var
circ:TMyCircle
begin
circ:=TMyPoint.Create;
try
 circ.X:=6;
 circ.Y:=8;
 circ.R:=-10;
 ......
finally
 pt.Free;
end;


Радиус отрицательным быть не может. Во избежание делаем следующее:


type
TMyCircle=class
 private
  FX:Integer;
  FY:Integer;
  FR:Integer;
  procedure SetRadius(const Value:Integer);
 public
  property X:Integer Read FX Write FX;
  property Y:Integer Read FY Write FY;
  property R:Integer Read FR Write SetRadius;
 end;

procedure TMyCircle.SetRadius(const Value:Integer);
begin
if Value<0 then FR:=0 else FR:=Value;
end;


Т.е. вместо того, чтобы писать значение радиуса напрямую в поле, мы запускаем процедуру, которая сначала проверяет поступившее значение на валидность, а потом пишет его в поле.

Также и с чтением.


 
Palladin ©   (2004-08-24 19:38) [5]

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


 
Anatoly Podgoretsky ©   (2004-08-24 19:43) [6]

Суслик ©   (24.08.04 19:26) [2]
Это его проблема :-)

Jus   (24.08.04 19:29) [3]
Сказано выглядит как переменная, вот и обращайся как к переменной, к тому же если ты не знаешь объявление, то визуально отличить что справа - переменная, константа, поле или функция нельзя.


 
Fay ©   (2004-08-24 20:02) [7]

2 Anatoly Podgoretsky ©   (24.08.04 19:43) [6]
>> Сказано выглядит как переменная, вот и обращайся как к переменной
Ага 8)
Inc(Application.MainForm.Tag);


 
Jus   (2004-08-24 20:32) [8]

Ega23 ©

=запись понятно, а чтение зачем? откуда чтение?


 
begin...end ©   (2004-08-24 20:35) [9]


> [8] Jus   (24.08.04 20:32)

Из поля. Можно было бы и напрямую поле читать, но так не принято.
Ну или... мало ли, может быть тебе надо какие-то действия при этом делать.


 
Jus   (2004-08-24 20:37) [10]

тогда всё ясно! Всем спасибо!)


 
Anatoly Podgoretsky ©   (2004-08-25 01:20) [11]

Fay ©   (24.08.04 20:02) [7]
А убивать надо Inc

Application.MainForm.Tag := Application.MainForm.Tag + 1;


 
Алхимик ©   (2004-08-25 01:25) [12]


> [11] Anatoly Podgoretsky ©   (25.08.04 01:20)
> Fay ©   (24.08.04 20:02) [7]
> А убивать надо Inc

Отмазки. :)


 
GuAV ©   (2004-08-25 01:54) [13]

Интересная вещь - такое работает (Д7):

procedure TForm1.Button1Click(Sender: TObject);
begin
 ShowMessage(IntToStr(Integer(@(Application.MainForm.Tag))));
end;


 
Gero ©   (2004-08-25 02:00) [14]


> Интересная вещь - такое работает

А что здесь удивительного?


 
Vitalik ©   (2004-08-25 09:02) [15]

Хоть и не в тему, просто вспомнилось...

Однажды мне нужно было в каком-то компоненте хранить указатель на данные. Ну то есть мне нужно было типа поля Data (как у TreeNode), но у этого компонента не было такого поля... Кажется, это был TChartSeries...
Но зато было поле tag...
Выкрутился так:

type
PSomeType = ^... указатель какой-то, не помню какой...
...

var
ST: PSomeType;
begin
New(ST)
...
ChartSeries.tag := integer(st);

И потом получал указатель на эти данные так:
ST := PSomeType(ChartSeries.tag)
Dispose(ST)


 
Anatoly Podgoretsky ©   (2004-08-25 10:15) [16]

Алхимик ©   (25.08.04 01:25) [12]
Нет, не признаю функции с var параметрами, к тому же не типизироваными, предпочитаю естественное выражение, где будет и проверка типа. По эффективности одинаковый код будет сгенерирован и кроме того позволяет кроме переменных использовать и свойства.


 
GuAV ©   (2004-08-25 13:32) [17]


>
> А что здесь удивительного?

Property+F1:
Unlike fields, properties cannot be passed as var parameters, nor can the @ operator be applied to a property. The reason is that a property doesn"t necessarily exist in memory.


 
VMcL ©   (2004-08-25 13:48) [18]

>>GuAV ©  (25.08.04 01:54) [13]

Потому что read FTag, AFAIK.

>Anatoly Podgoretsky ©  (25.08.04 10:15) [16]

>не признаю функции с var параметрами, к тому же не типизироваными

Не знаю, не знаю. Я вот, SysUtils.FreeAndNil, например, очень даже уважаю :-)


 
KSergey ©   (2004-08-25 14:25) [19]

> [18] VMcL ©   (25.08.04 13:48)
> Не знаю, не знаю. Я вот, SysUtils.FreeAndNil, например,
> очень даже уважаю :-)

АП давно на нее зуб имеет ;),

> [15] Vitalik ©   (25.08.04 09:02)

Вы уж извините, но это стандартный ход...


 
Skyle ©   (2004-08-25 14:39) [20]


> [15] Vitalik ©   (25.08.04 09:02)

TComponent.Tag

Tag has no predefined meaning. The Tag property is provided for the convenience of developers. It can be used for storing an additional integer value or it can be typecast to any 32-bit value such as a component reference or a pointer.

Так что непонятно, кто выкрутился...;-)

Насколько я понимаю, рассказывая о property нельзя забывать об инкапсуляции. Потому как property - её отражение в языке.


 
GuAV ©   (2004-08-25 16:07) [21]

Anatoly Podgoretsky ©   (25.08.04 10:15) [16]

> Нет, не признаю функции с var параметрами,

А функцие с out параметрами?
А функции, возвращающие string или record?

> к тому же не типизироваными,

Создайте новый проект (VCL Application). Весь код Вашего проекта (стандартные модули не в счет) будет состоять из трёх вызовов методов. Два вообще без параметров, а в одном использован var-параметр, причем нетипризрованный. Вы перепишете эту строку?

Я не люблю var параметры, когда нужно ещё nil передавать.
И то можно выкрутится:

procedure Proc(var I: Cardinal); external mydll;
...
Proc(Cardinal(nil^));



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2004.09.12;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.051 c
14-1093159148
HSD
2004-08-22 11:19
2004.09.12
эмуляция наличия тяжелых файлов


4-1090796515
Wital
2004-07-26 03:01
2004.09.12
Disable Enable MenuItem in MainMenu


1-1093005329
YaMaximus
2004-08-20 16:35
2004.09.12
Перехват всех Click-ов по кнопкам


1-1093616975
dimon1979
2004-08-27 18:29
2004.09.12
Японский кроссворд


3-1092315895
DennisLNC
2004-08-12 17:04
2004.09.12
сортировка





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский