Форум программистов, компьютерный форум, киберфорум
Наши страницы

Lazarus

Войти
Регистрация
Восстановить пароль
 
ProFrog111
0 / 0 / 0
Регистрация: 08.10.2015
Сообщений: 110
#1

Инкапсуляция характеристик - Lazarus

12.06.2016, 21:19. Просмотров 254. Ответов 6
Метки нет (Все метки)

Основы ООП.
В задании требуется инкапсулировать все характеристики класса и соответственно вывести занесенную в экземпляр информацию, нашел пример инкапсуляции в книге Алексеев Е.Р., Чеснокова О.В., Кучер Т.В., но приведенный пример там немного отличается от моего и не все до конца понятно.
Так же в Lazarus выбивает ошибку:
"Forward declaration not solved Get_Kol"


(и так для каждой процедуры)

Pascal
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
unit Unit2;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils;
  type
      THouse = class(TObject)
  private
       FAdres: string;
       FCvet: string;
       FKolKv: integer;
       FKolEt: integer;
       FGod:integer;
  public
        constructor Create(a1,c1:string;kk1,ke1,g1:integer);
       function info:string;
       procedure Get_KolEt(ke1:integer);
       procedure Get_KolKv(kk1:integer);
       procedure Get_Cvet(c1:string);
       procedure Get_Adres(a1:string);
  published
       Property g: integer read FGod;
       Property ke: integer read FKolEt write Get_KolEt;
       Property kk: integer read FKolKv write Get_KolKv;
       Property c: string read FCvet write Get_Cvet;
       Property a: string read FAdres write Get_Adres;
      end;
 
implementation
   constructor THouse.Create(a1,c1:string;kk1,ke1,g1:integer);
       begin
       FAdres:= a1;
        FCvet:= c1;
        FKolKv:= kk1;
        FKolEt:= ke1;
        FGod:= g1;
       inherited Create;
       end;
function THouse.info:string;
 begin
 result:=FAdres+'  '+FCvet+'  '+intTostr(FKolKv)+'  '+intTostr(FKolEt)+'  '+intTostr(FGod);
 end;
 
 
end.

Pascal
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
68
69
70
71
72
73
74
75
76
unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, Grids,
  StdCtrls, Buttons,unit2;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Edit1Change(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
    Hou: THouse;
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.FormCreate(Sender: TObject);
begin
 
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
sa,cz:string;
kolkv,kolet,godst:integer;
begin
   sa:= Edit1.Text;
   cz:= Edit2.Text;
   kolkv:=strtoint (Edit3.Text);
   kolet :=strtoint (Edit4.Text);
   godst :=strtoint (Edit5.Text);
Hou:=THouse.Create(sa,cz,kolkv,loket,godst);
showmessage('Готово');
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
  Hou.Free;
end;
 
procedure TForm1.Edit1Change(Sender: TObject);
begin
 
end;
 
end.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.06.2016, 21:19
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Инкапсуляция характеристик (Lazarus):

Инкапсуляция (зоны видимости атрибутов объекта). Свойства - Lazarus
Замечания: 1. При решении задачи созданные классы разместить в отдельном от программы модуле. 2. Результат вычисления выполненного в...

Взаимодействие классов (инкапсуляция). Наибольший общий делитель - Lazarus
В классе "НОД" рассчитывается наибольший общий делитель двух чисел. Использовать объект данного класса для нахождения НОД для трёх чисел...

Отображение технических характеристик компьютера - Delphi
Помогите пожалуйста как сделать программу при открытии которой в ней выводились все технические характеристика компьютера(оператива, видео...

Дешифрация сообщений на основе частотных характеристик языка сообщения - Delphi
Как реализовать таую задачу? Дешифрация сообщений на основе частотных характеристик языка сообщения. Вам удалось перехватить четыре...

План видов характеристик в качестве характеристики значения плана видов характеристик - 1С
всем привет. я вроде как чета понимаю в 1с и казалось бы херли там план видов характеристик - все просто. и вот возник вопрос: План...

Инкапсуляция - Java SE
Приятелю задали задачу Реализуйте класс quantity, инкапсулирующий количество товаров с поддержкой различных типов единиц измерения....

6
Joey
Джоуи Скалолазер
629 / 359 / 100
Регистрация: 05.05.2015
Сообщений: 2,128
Записей в блоге: 2
13.06.2016, 00:04 #2
ProFrog111, если я правильно понял, Вам всего лишь требуется все методы и свойства класса перевести в раздел private:
Кликните здесь для просмотра всего текста
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
unit Unit2;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils;
  type
      THouse = class(TObject)
  private
       FAdres: string;
       FCvet: string;
       FKolKv: integer;
       FKolEt: integer;
       FGod:integer;
       function info:string;
       procedure Get_KolEt(ke1:integer);
       procedure Get_KolKv(kk1:integer);
       procedure Get_Cvet(c1:string);
       procedure Get_Adres(a1:string);
       Property g: integer read FGod;
       Property ke: integer read FKolEt write Get_KolEt;
       Property kk: integer read FKolKv write Get_KolKv;
       Property c: string read FCvet write Get_Cvet;
       Property a: string read FAdres write Get_Adres;
 public
       constructor Create(a1,c1:string;kk1,ke1,g1:integer);       
      end;
 
implementation
   constructor THouse.Create(a1,c1:string;kk1,ke1,g1:integer);
       begin
       FAdres:= a1;
        FCvet:= c1;
        FKolKv:= kk1;
        FKolEt:= ke1;
        FGod:= g1;
       inherited Create;
       end;
function THouse.info:string;
 begin
 result:=FAdres+'  '+FCvet+'  '+intTostr(FKolKv)+'  '+intTostr(FKolEt)+'  '+intTostr(FGod);
 end; 
 
end.

Кликните здесь для просмотра всего текста
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
68
69
70
71
72
73
74
75
76
unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, Grids,
  StdCtrls, Buttons,unit2;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
  private
    { private declarations }
     Button1: TButton;
    Button2: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Edit1Change(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
    Hou: THouse;
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.FormCreate(Sender: TObject);
begin
 
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
sa,cz:string;
kolkv,kolet,godst:integer;
begin
   sa:= Edit1.Text;
   cz:= Edit2.Text;
   kolkv:=strtoint (Edit3.Text);
   kolet :=strtoint (Edit4.Text);
   godst :=strtoint (Edit5.Text);
Hou:=THouse.Create(sa,cz,kolkv,loket,godst);
showmessage('Готово');
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
  Hou.Free;
end;
 
procedure TForm1.Edit1Change(Sender: TObject);
begin
 
end;
 
end.

Так?

Добавлено через 4 минуты
Цитата Сообщение от ProFrog111 Посмотреть сообщение
Так же в Lazarus выбивает ошибку:
"Forward declaration not solved Get_Kol"
Ну дак правильно, Вы объявили несколько процедур, но нигде их не реализовали, вот компилятор и ругается. ВСЕ объявленные процедуры должны быть описаны, то есть после слова implementation у Вас должно быть написано:
Delphi
1
2
3
4
procedure Get_KolEt(ke1: integer);
begin
...
end;
и т.д. для всех объявленных процедур и функций. Можете даже оставить их пустыми, например:
Delphi
1
2
3
4
procedure Get_KolEt(ke1: integer);
begin
   //
end;
0
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
24004 / 15985 / 4834
Регистрация: 22.10.2011
Сообщений: 28,263
Записей в блоге: 5
13.06.2016, 01:24 #3
Цитата Сообщение от Joey Посмотреть сообщение
требуется все методы и свойства класса перевести в раздел private:
В чем смысл переноса properties в раздел private? Поля и Методы - да, должны быть приватными. А вот свойства - публичными, иначе из другого модуля к ним просто не обратишься, и их существование теряет всякий смысл...
0
vlisp
376 / 343 / 66
Регистрация: 10.08.2015
Сообщений: 1,043
Завершенные тесты: 1
13.06.2016, 19:20 #4
Глагол Get означает взять, в данном случае из поля , глагол Set - означает положить, синоним Put... Это какое-то сумасшествие неадекватное... Если не знаешь английский, иди в макдональдс, продавать бургеры.

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
type
 
THouse = class(TObject)
private
       FAdres: string;
       FCvet: string;
       FKolKv: integer;
       FKolEt: integer;
       FGod:integer;
 
       procedure Get_KolEt(ke1:integer);
       procedure Get_KolKv(kk1:integer);
       procedure Get_Cvet(c1:string);
       procedure Get_Adres(a1:string);
 
public
       constructor Create(a1, c1 : string; kk1, ke1, g1 : integer); 
       function info:string;
       Property Adress       : string  read FAdres write Get_Adres;
       Property BuildYear    : integer read FGod;
       Property StageCount   : integer read FKolEt write Get_KolEt;
       Property FlatCount    : integer read FKolKv write Get_KolKv;
       Property CurrentColor : string  read FCvet  write Get_Cvet;
end;
0
ProFrog111
0 / 0 / 0
Регистрация: 08.10.2015
Сообщений: 110
15.06.2016, 23:24  [ТС] #5
Спасибо большое, учел ваш совет и в скором времени приобрету словарь для более глубокого изучения английского=)

Добавлено через 5 минут
Цитата Сообщение от Joey Посмотреть сообщение
ProFrog111, если я правильно понял, Вам всего лишь требуется все методы и свойства класса перевести в раздел private:
Кликните здесь для просмотра всего текста
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
unit Unit2;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils;
  type
      THouse = class(TObject)
  private
       FAdres: string;
       FCvet: string;
       FKolKv: integer;
       FKolEt: integer;
       FGod:integer;
       function info:string;
       procedure Get_KolEt(ke1:integer);
       procedure Get_KolKv(kk1:integer);
       procedure Get_Cvet(c1:string);
       procedure Get_Adres(a1:string);
       Property g: integer read FGod;
       Property ke: integer read FKolEt write Get_KolEt;
       Property kk: integer read FKolKv write Get_KolKv;
       Property c: string read FCvet write Get_Cvet;
       Property a: string read FAdres write Get_Adres;
 public
       constructor Create(a1,c1:string;kk1,ke1,g1:integer);       
      end;
 
implementation
   constructor THouse.Create(a1,c1:string;kk1,ke1,g1:integer);
       begin
       FAdres:= a1;
        FCvet:= c1;
        FKolKv:= kk1;
        FKolEt:= ke1;
        FGod:= g1;
       inherited Create;
       end;
function THouse.info:string;
 begin
 result:=FAdres+'  '+FCvet+'  '+intTostr(FKolKv)+'  '+intTostr(FKolEt)+'  '+intTostr(FGod);
 end; 
 
end.

Кликните здесь для просмотра всего текста
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
68
69
70
71
72
73
74
75
76
unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, Grids,
  StdCtrls, Buttons,unit2;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
  private
    { private declarations }
     Button1: TButton;
    Button2: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Edit1Change(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
    Hou: THouse;
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.FormCreate(Sender: TObject);
begin
 
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
sa,cz:string;
kolkv,kolet,godst:integer;
begin
   sa:= Edit1.Text;
   cz:= Edit2.Text;
   kolkv:=strtoint (Edit3.Text);
   kolet :=strtoint (Edit4.Text);
   godst :=strtoint (Edit5.Text);
Hou:=THouse.Create(sa,cz,kolkv,loket,godst);
showmessage('Готово');
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
  Hou.Free;
end;
 
procedure TForm1.Edit1Change(Sender: TObject);
begin
 
end;
 
end.

Так?

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

Ну дак правильно, Вы объявили несколько процедур, но нигде их не реализовали, вот компилятор и ругается. ВСЕ объявленные процедуры должны быть описаны, то есть после слова implementation у Вас должно быть написано:
Delphi
1
2
3
4
procedure Get_KolEt(ke1: integer);
begin
...
end;
и т.д. для всех объявленных процедур и функций. Можете даже оставить их пустыми, например:
Delphi
1
2
3
4
procedure Get_KolEt(ke1: integer);
begin
   //
end;
Вроде как описал данные процедуры, но компилятор выбивает ошибку
"Identifier not found FKolEt,FkolKv"
(в строках 52,54,58,60)
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
68
69
70
unit Unit2;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils;
 type
 
THouse = class(TObject)
private
       FAdres: string;
       FCvet: string;
       FKolKv: integer;
       FKolEt: integer;
       FGod:integer;
 
       procedure Get_KolEt(ke1:integer);
       procedure Get_KolKv(kk1:integer);
       procedure Get_Cvet(c1:string);
       procedure Get_Adres(a1:string);
 
public
       constructor Create(a1, c1 : string; kk1, ke1, g1 : integer);
       function info:string;
       Property Adress       : string  read FAdres write Get_Adres;
       Property BuildYear    : integer read FGod;
       Property StageCount   : integer read FKolEt write Get_KolEt;
       Property FlatCount    : integer read FKolKv write Get_KolKv;
       Property CurrentColor : string  read FCvet  write Get_Cvet;
end;
 
implementation
   constructor THouse.Create(a1,c1:string;kk1,ke1,g1:integer);
       begin
       FAdres:= a1;
        FCvet:= c1;
        FKolKv:= kk1;
        FKolEt:= ke1;
        FGod:= g1;
       inherited Create;
       end;
   function THouse.info:string;
 begin
 result:=FAdres+'  '+FCvet+'  '+intTostr(FKolKv)+'  '+intTostr(FKolEt)+'  '+intTostr(FGod);
 
 
 end;
   procedure Get_KolEt(ke1: integer);
begin
  if ke1>120 then FKolEt:=ke1
  else
    FKolEt:=25;
end;
 procedure Get_KolKv(kk1:integer);
 begin
   if kk1>120 then FKolKv:=kk1
  else
    FKolKv:=200;
end;
   procedure Get_Cvet(c1:string);
     begin
   //
end;
  procedure Get_Adres(a1:string);
  begin
   //
end;
end.
0
Joey
Джоуи Скалолазер
629 / 359 / 100
Регистрация: 05.05.2015
Сообщений: 2,128
Записей в блоге: 2
15.06.2016, 23:58 #6
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
У вас в описании процедур должно указываться, какому классу принадлежит эта процедура, например, в строке 56 должно быть:
Delphi
1
procedure THouse.Get_KolKv(kk1:integer);
и т.д.
0
ProFrog111
0 / 0 / 0
Регистрация: 08.10.2015
Сообщений: 110
16.06.2016, 01:06  [ТС] #7
А ну конечно,спасибо большое!
0
16.06.2016, 01:06
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.06.2016, 01:06
Привет! Вот еще темы с ответами:

инкапсуляция - C++
Возможно ли определение пользовательского типа, чтобы им можно было пользоваться только внутри класса? На например class aaaa { ...

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

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

Инкапсуляция. - C++
Написать программу имитирующую работу банковского счета методом инкапсуляции. Программа должна быть сделана в консольном приложении. И...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru