Форум программистов, компьютерный форум, киберфорум
Наши страницы
Lazarus
Войти
Регистрация
Восстановить пароль
 
ProFrog111
0 / 0 / 7
Регистрация: 08.10.2015
Сообщений: 123
#1

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

12.06.2016, 21:19. Просмотров 287. Ответов 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):

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

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

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

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

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

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

6
Joey
Модератор
827 / 549 / 218
Регистрация: 05.05.2015
Сообщений: 3,181
Записей в блоге: 1
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
25616 / 17169 / 6828
Регистрация: 22.10.2011
Сообщений: 30,364
Записей в блоге: 6
13.06.2016, 01:24 #3
Цитата Сообщение от Joey Посмотреть сообщение
требуется все методы и свойства класса перевести в раздел private:
В чем смысл переноса properties в раздел private? Поля и Методы - да, должны быть приватными. А вот свойства - публичными, иначе из другого модуля к ним просто не обратишься, и их существование теряет всякий смысл...
0
vlisp
443 / 412 / 103
Регистрация: 10.08.2015
Сообщений: 1,397
Завершенные тесты: 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 / 7
Регистрация: 08.10.2015
Сообщений: 123
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
Модератор
827 / 549 / 218
Регистрация: 05.05.2015
Сообщений: 3,181
Записей в блоге: 1
15.06.2016, 23:58 #6
Лучший ответ Сообщение было отмечено ProFrog111 как решение

Решение

У вас в описании процедур должно указываться, какому классу принадлежит эта процедура, например, в строке 56 должно быть:
Delphi
1
procedure THouse.Get_KolKv(kk1:integer);
и т.д.
0
ProFrog111
0 / 0 / 7
Регистрация: 08.10.2015
Сообщений: 123
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
Привет! Вот еще темы с решениями:

Инкапсуляция
Я понял, что такое инкапсуляция. Понял что такое сеттер, и для чего он работает. Но для чего геттер? Он возвращает значение? Какое...

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

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

Инкапсуляция
import random class Pasvagon(): def __init__(self, name, capacity, procent): self.__name = name ...


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

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

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