Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.87/47: Рейтинг темы: голосов - 47, средняя оценка - 4.87
16 / 14 / 0
Регистрация: 03.05.2010
Сообщений: 189

Инкапсуляция

10.03.2011, 19:59. Показов 10033. Ответов 50
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Прочитал что инкапсуляция в делфи осуществляется путем занесения полей и методов в раздел private, однако все равно понять не могу что к чему

Есть задание - создать класс калькулятор , инкапсулирющий в себе методы сложения умножения вычитания и деления 2х чисел

Так что мне создать обычный класс- добавить методы в private и задача решена? ил я что то путаю?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.03.2011, 19:59
Ответы с готовыми решениями:

Инкапсуляция
Требуется произвести проверку данных в Edit1 Edit2 Edit3 Выбивает ошибку некорректных данных unit Unit1; interface

Инкапсуляция и свойства классов
Ребят, такая проблема, пол интернета перерыл, но никак не могу понять, как использовать инкапсуляцию и свойства классов. Хотелось бы...

Delphi - что такое инкапсуляция
Скажите пожалуйста что такое инкапсуляция?

50
 Аватар для Arcor
5709 / 2300 / 466
Регистрация: 20.11.2009
Сообщений: 7,721
Записей в блоге: 1
10.03.2011, 21:59
Студворк — интернет-сервис помощи студентам
Автору небольшой самодельный класс на скорую руку
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
67
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type  Str = String;
 
type TPrimer = class
    fName: Str;
  private
    procedure SetName(NewName: Str);
    function GetName: Str;
    function ShowName: Str;
  public
    property Name: Str read GetName write SetName;
end;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;
 
var
  Form1: TForm1;
  primer: TPrimer;
implementation
 
{$R *.dfm}
 
{ TPrimer }
 
function TPrimer.GetName: Str;
begin
  Result := fName;
end;
 
procedure TPrimer.SetName(NewName: Str);
begin
  fName := NewName;
end;
 
function TPrimer.ShowName: Str;
begin
  Result := Name;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  Caption := primer.ShowName;
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  primer := TPrimer.Create;
  primer.SetName('PrimerName');
end;
 
end.
1
 Аватар для anonimus
2184 / 1255 / 143
Регистрация: 28.04.2010
Сообщений: 4,592
10.03.2011, 22:05
Arcor, небольшая поправка, зачем создавать лишнюю функцию GetName
можно читать прям из fName
Delphi
1
property Name: Str read fName write SetName;
0
 Аватар для Arcor
5709 / 2300 / 466
Регистрация: 20.11.2009
Сообщений: 7,721
Записей в блоге: 1
10.03.2011, 22:09
А да, можно еще не так присвоить имя, можно еще и вот так пользуясь уже свойством

вместо
Delphi
1
2
3
4
5
procedure TForm1.FormCreate(Sender: TObject);
begin
  primer := TPrimer.Create;
  primer.SetName('PrimerName');
end;
можно, в дальнейшем даже и нужно, вот так

Delphi
1
2
3
4
5
procedure TForm1.FormCreate(Sender: TObject);
begin
  primer := TPrimer.Create;
  primer.Name := 'PrimerName';
end;
Добавлено через 2 минуты
Цитата Сообщение от anonimus Посмотреть сообщение
Arcor, небольшая поправка, зачем создавать лишнюю функцию GetName
можно читать прям из fName
Delphi
1
property Name: Str read fName write SetName;
Не знаю, так повелось изначала, так и привык уже, пусть у меня останется по моему стилю Ах да, лишнюю память занимать, которой в наши дни так как раз и не хватает
0
 Аватар для anonimus
2184 / 1255 / 143
Регистрация: 28.04.2010
Сообщений: 4,592
10.03.2011, 22:14
а так
Delphi
1
 primer.SetName('PrimerName');
работать не будет, только так
Delphi
1
primer.SetName:='PrimerName';
Добавлено через 2 минуты
Arcor, что-то ты вообще небо с землей перепутал.
Delphi
1
primer.Name := 'PrimerName';
как же ты задаешь значение свойству Name если оно у тебя для чтения
0
 Аватар для Arcor
5709 / 2300 / 466
Регистрация: 20.11.2009
Сообщений: 7,721
Записей в блоге: 1
10.03.2011, 22:15
Цитата Сообщение от anonimus Посмотреть сообщение
а так
Delphi
1
 primer.SetName('PrimerName');
работать не будет, только так
Delphi
1
primer.SetName:='PrimerName';
Добавлено через 2 минуты
Arcor, что-то ты вообще небо с землей перепутал.
Delphi
1
primer.Name := 'PrimerName';
как же ты задаешь значение свойству Name если оно у тебя для чтения
реакция на нажатие кнопки мыши ...
Миниатюры
Инкапсуляция  
0
 Аватар для anonimus
2184 / 1255 / 143
Регистрация: 28.04.2010
Сообщений: 4,592
10.03.2011, 22:17
к чему этот скрин?
на нем не видно не фига
0
 Аватар для Arcor
5709 / 2300 / 466
Регистрация: 20.11.2009
Сообщений: 7,721
Записей в блоге: 1
10.03.2011, 22:19
И я кстати ничего не путаю

Добавлено через 2 минуты
Цитата Сообщение от anonimus Посмотреть сообщение
к чему этот скрин?
на нем не видно не фига
все на нем видно, как я закомнтировал спецом строчку
Delphi
1
primer.Name := 'PrimerName';
и заменил на
Delphi
1
primer.SetName('PrimerName');
и смотри туда, куда я вывел результат работы.. а ты мне говоришь, что оно не работает. Ах да, у меня дельфи может не такое как у вас
0
 Аватар для anonimus
2184 / 1255 / 143
Регистрация: 28.04.2010
Сообщений: 4,592
10.03.2011, 22:22
извиняюсь, SetName у тебя это метод, я думал свойство
0
 Аватар для Arcor
5709 / 2300 / 466
Регистрация: 20.11.2009
Сообщений: 7,721
Записей в блоге: 1
10.03.2011, 22:23
Ты код сам внимательно посмотри, где там что стоит для чтения и что для записи, Установили что Name может использоваться как для чтения и как для записи
0
 Аватар для anonimus
2184 / 1255 / 143
Регистрация: 28.04.2010
Сообщений: 4,592
10.03.2011, 22:23
ну нафик создавать свойство а использовать метод напримую?
0
 Аватар для Arcor
5709 / 2300 / 466
Регистрация: 20.11.2009
Сообщений: 7,721
Записей в блоге: 1
10.03.2011, 22:26
Цитата Сообщение от anonimus Посмотреть сообщение
ну нафик создавать свойство а использовать метод напримую?
это ты про это?
Delphi
1
primer.SetName('PrimerName');
ступил сперва
0
16 / 14 / 0
Регистрация: 03.05.2010
Сообщений: 189
10.03.2011, 22:32  [ТС]
блин=) так что мне там написать нада чтобы я мог спокойно использывать свою функцию сложения то?
0
 Аватар для Arcor
5709 / 2300 / 466
Регистрация: 20.11.2009
Сообщений: 7,721
Записей в блоге: 1
10.03.2011, 22:36
Цитата Сообщение от Mr_skiner Посмотреть сообщение
блин=) так что мне там написать нада чтобы я мог спокойно использывать свою функцию сложения то?
Где?

пиши в приватах

Delphi
1
function Summ(a,b: Integer): Integer;
потом клацай комбинацию Shift + C оно создаст тебе заготовок функции, пиши в функции

Delphi
1
2
3
4
5
function Summ(a,b: Integer): Integer;
 
begin
Result := a+b;
end;
и вызывай потом Summ в любом месте своей программы, но в пределах данной "формы"
вызывать вот так <название класса>.Summ(1,5);

и все
0
16 / 14 / 0
Регистрация: 03.05.2010
Сообщений: 189
10.03.2011, 22:43  [ТС]
это я знаю, а зачем тога property писать нада? я насколько понял это настройки "видимости"

Добавлено через 1 минуту
Цитата Сообщение от Mr_skiner Посмотреть сообщение
type tcalc= class
private fa,fb,fc:real;
function sum(a,b:real;nom:integer):real;
public
property
вот после этого что написать нужно, чтобы моя функция работала?
0
 Аватар для Arcor
5709 / 2300 / 466
Регистрация: 20.11.2009
Сообщений: 7,721
Записей в блоге: 1
10.03.2011, 22:50
Цитата Сообщение от Mr_skiner Посмотреть сообщение
это я знаю, а зачем тога property писать нада? я насколько понял это настройки "видимости"

Добавлено через 1 минуту

вот после этого что написать нужно, чтобы моя функция работала?
Смотри, ты когда у кнопки используешь метод Caption, когда ты нажмешь даже на клавиши Strl+Space то ты не увидишь там уже тех функций и процедур которые задавались при создании кнопки в файле отдельно лежащим в каталоге программы с названием вроде бы Tbutton, а ты видишь только свойство Caption, а как ты видел property у нас лежат уже не в приватах, а в пабликах, вот создаем свойство мы и говорим что для него будет информация читаться откуда-то или записываться в него либо и то и другое
0
16 / 14 / 0
Регистрация: 03.05.2010
Сообщений: 189
10.03.2011, 22:52  [ТС]
ич то там написать нада в данной ситуации? уже все классы понял - а вот эту инкапсуляцию ну никак
0
 Аватар для Arcor
5709 / 2300 / 466
Регистрация: 20.11.2009
Сообщений: 7,721
Записей в блоге: 1
10.03.2011, 22:52
а что ты имеешь ввиду под тем чтобы функция работала? хочешь тоже так через свойства записать?
0
 Аватар для Евгений В
912 / 672 / 134
Регистрация: 01.03.2010
Сообщений: 1,279
10.03.2011, 22:54
Mr_skiner,
Попробую и я объяснить.
Можно создать класс, и обращаться к его полям напрямую. Например:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
  TMyClass=class
  private
    { Private declarations }
  A:Integer; // назначим поле
end;
 
var
  Form1: TForm1;
  MyClass:TMyClass;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.btn1Click(Sender: TObject);
begin
 MyClass.A:=11; // здесь мы обращаемся к полю A на прямую
end;
По задумке ООП обращение к полям на прямую считается плохим тоном.
Мы должны обращаться к полям через методы, которые могут проверить,например, на допустимость ввода, или сделать еще какие либо ваши задумки.
Свойство Property , позволяет ограничить права на изменение поля, и организует доступ через ваши методы. В этом примере через метод, который я назвал как SetA.

Пример:
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
type
  TForm1 = class(TForm)
    btn1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure btn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
  TMyClass=class
  private
    { Private declarations }
  A:Integer;
  Procedure SetA(Val: Integer);  // Объявление процедуры для записи значения свойства
  public
    { Public declarations }
  Property MyA: Integer read A write SetA; // можно читать А или изменять его при помощи SetA;
  end;
 
var
  Form1: TForm1;
  MyClass:TMyClass;
 
implementation
 
{$R *.dfm}
 
{ TMyClass }
 
 
procedure TMyClass.SetA(Val: Integer);
begin
  A:=Val;
 if A>10 then ShowMessage('Не допустимое число');
 
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
 MyClass:=TMyClass.Create;
 
end;
 
procedure TForm1.btn1Click(Sender: TObject);
begin
 MyClass.MyA:=11;
end;
Что тут происходит?
Написав MyClass.MyA:=11 мы задействовали Property MyA: Integer read A write SetA;.
Грубо говоря, числу А будет присвоено значение 11 и оно пройдет проверку в процедуре SetA
1
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
10.03.2011, 22:55
Delphi
1
2
3
4
5
6
7
8
9
10
11
TCalc = class
private 
  FResult: Extended;
public
  procedure Add(Value: Extended) ;
  procedure Sub(Value: Extended) ;
  procedure Mul(Value: Extended) ;
  procedure Div(Value: Extended) ;
  procedure Clear;
  property Result: Extended read FResult;
end;
1
 Аватар для Arcor
5709 / 2300 / 466
Регистрация: 20.11.2009
Сообщений: 7,721
Записей в блоге: 1
10.03.2011, 22:57
Цитата Сообщение от Евгений В Посмотреть сообщение
Mr_skiner,
Попробую и я объяснить.
Можно создать класс, и обращаться к его полям напрямую. Например:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
  TMyClass=class
  private
    { Private declarations }
  A:Integer; // назначим поле
end;
 
var
  Form1: TForm1;
  MyClass:TMyClass;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.btn1Click(Sender: TObject);
begin
 MyClass.A:=11; // здесь мы обращаемся к полю A на прямую
end;
По задумке ООП обращение к полям на прямую считается плохим тоном.
Мы должны обращаться к полям через методы, которые могут проверить,например, на допустимость ввода, или сделать еще какие либо ваши задумки.
Свойство Property , позволяет ограничить права на изменение поля, и организует доступ через ваши методы. В этом примере через метод, который я назвал как SetA.

Пример:
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
type
  TForm1 = class(TForm)
    btn1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure btn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
  TMyClass=class
  private
    { Private declarations }
  A:Integer;
  Procedure SetA(Val: Integer);  // Объявление процедуры для записи значения свойства
  public
    { Public declarations }
  Property MyA: Integer read A write SetA; // можно читать А или изменять его при помощи SetA;
  end;
 
var
  Form1: TForm1;
  MyClass:TMyClass;
 
implementation
 
{$R *.dfm}
 
{ TMyClass }
 
 
procedure TMyClass.SetA(Val: Integer);
begin
  A:=Val;
 if A>10 then ShowMessage('Не допустимое число');
 
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
 MyClass:=TMyClass.Create;
 
end;
 
procedure TForm1.btn1Click(Sender: TObject);
begin
 MyClass.MyA:=11;
end;
Что тут происходит?
Написав MyClass.MyA:=11 мы задействовали Property MyA: Integer read A write SetA;.
Грубо говоря, числу А будет присвоено значение 11 и оно пройдет проверку в процедуре SetA
слава богу можно сходить покурить
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.03.2011, 22:57
Помогаю со студенческими работами здесь

Инкапсуляция - есть ли она вообще?
решил немного освежить свои знания delphi, меня удивило следующее: есть доступ снаружи к private членам, как это понимать? зачем же тогда...

Принципы ООП (наследование, инкапсуляция и полиморфизм)
1. Принципы ООП (наследование, инкапсуляция и полиморфизм).

Написать простейшую программу, где задействованы наследование, полиморфизм или инкапсуляция
Ребята у меня завтра экзамен по ООП в 17:00(Объектно-ориентированное программирование )Я перевёлся на факультет &quot;Информатика и...

Студенческая библиотека. Создать иерархию классов чтобы использовалась инкапсуляция подражания полиморфизм
Тема:Студенческая библиотека Информационный объект пользователь библиотеки Имя__________________текст___________________ Имя ...

Инкапсуляция компонента
Добрый вечер всем. Вопрос как мне кажется риторический, ввиду его нестандартности. Возможно ли в Delphi создать компонент так чтобы он...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru