IPB
ЛогинПароль:

> 

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

> Fpc, методы класса
сообщение
Сообщение #1


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Почему я не могу напрямую вызвать метод класса ? ClassName.MethodName ? Просто интересно.

{$N+}
{$mode objfpc}

unit Polinom;

interface

type

TFloat = Double;

TCoeff = TFloat;

TCoeffs = array of TCoeff;

TPolinom = class

public

constructor Create(const n: Word);

destructor Destroy;

procedure ReadCoeffs;

procedure PrintCoeffs(const c: TCoeffs);

function GetDerivative(const c: TCoeffs): TCoeffs;

function GetCoeffs: TCoeffs;

property C: TCoeffs read GetCoeffs;

private

coeffs: TCoeffs;

end;

implementation

constructor TPolinom.Create(const n: Word);
begin
SetLength(coeffs, n + 1);
end;

destructor TPolinom.Destroy();
begin
SetLength(coeffs, 0);
end;

function TPolinom.GetCoeffs: TCoeffs;
begin
result := coeffs;
end;

procedure TPolinom.ReadCoeffs;
var
i: Integer;
begin
for i := 0 to Length(coeffs) - 1 do begin
write('x^', i, ' * ');
readln(coeffs[i]);
end;
end;

function TPolinom.GetDerivative(const c: TCoeffs): TCoeffs;
var
i: Integer;
begin
SetLength(result, Length© - 1);
for i := Length© - 1 downto 1 do
result [i - 1] := c[i] * i;
end;

procedure TPolinom.PrintCoeffs(const c: TCoeffs);
var
i: Integer;
begin
for i := 0 to Length© - 1 do
writeln('c[', i, ']=', c[i]:2:1);
end;

begin
end.


uses Crt, Polinom;

var

P: TPolinom;

degree: Integer;

test: TCoeffs;

begin
clrscr;


write('Введите степень полинома : '); readln(degree);

P := TPolinom.Create(degree);

P.ReadCoeffs;

test := P.C;

TPolinom.PrintCoeffs(test); // <---------------- Вот так нельзя делать ?!

P.Destroy;

readln;
end.


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Гость






Цитата
можно использовать метод класса, который проверит есть ли экземпляры с такими свойствами...
То, что выделено красным - несовместимо...

Понимаешь, в чем дело... В Class Method-е ты не можешь обращаться к данным класса/НЕ-классовым методам/свойствам... По одной простой причине: в момент, когда ты вызываешь Class Method у тебя может не быть ни одного экземпляра класса. То есть, проверить что-либо, касаемое экземпляров именно этого класса у тебя не выйдет.

Вот еще один классический пример использования:
НДС (ну, или любой другой налог), взимаемый за, скажем, услугу, описываемую типом T, изначально равен 17%... В какой-то момент этот налог увеличивается. При инициализации нового экземпляра класса мы должны увидеть новое значение налога, и при обработке информации, связанной с T (!!!), тоже будет рассматриваться новое значение. Что делаем?
{$mode ObjFPC}
unit unit_1;

interface

type
T = class
constructor init();

class procedure set_VAT(vat_value: double);
end;

implementation

var
VAT: double = 0.17;

constructor T.init();
begin
writeln('VAT = ', VAT:10:5);
end;

class procedure T.set_VAT(vat_value: double);
begin
VAT := vat_value;
end;

end.

Используем так:
uses unit_1;

var
obj_1, obj_2: T;

begin
obj_1 := T.init();
T.set_VAT(0.19);
obj_2 := T.init();
...
end.


Я знаю, что ты скажешь: "А почему бы не просто функция (вообще вне класса), которая будет изменять переменную? Или вообще напрямую изменять переменную, безо всяких функций... Зачем навороты?" Так?

Не так...
То, что напрямую - это нарушается принцип упрятывания информации, значит придется работать-таки через какой-то интерфейс. Простая функция? Да ни в коем случае... Я же сказал, что VAT - это налог за услугу T, а если будет 2 услуги? T и R, например? Налог на T один, на R - другой... Почему не просто метод в классе T? Потому, что у меня может не быть ни одного экземпляра инициализировано, а придется менять VAT. Создавать временный экземпляр, а потом удалять его - глупо.

Поэтому делаем Class Procedure, и программа становится прозрачной... Даже если у меня уже и есть инициализированные экземпляры класса T, я предпочту сделать НЕ так:
obj_1.set_VAT(0.19);
, а вот так:
T.set_VAT(0.19);
, потому, что налог распространяется НЕ на один какой-то экземпляр услуги, а на весь ее тип !!!

Понимаешь, в чем вся идея? Ты пользуешься Class Method-ами тогда, когда тебе нужно сделать что-то, что характерно НЕ для экземпляра, а в целом для класса...
 К началу страницы 
+ Ответить 

Сообщений в этой теме
klem4   Fpc, методы класса   12.10.2006 18:46
volvo   А что, собственно, тебя смущает? Ты данные какого …   12.10.2006 19:09
klem4   Нет, я хочу вызвать именно метод класса, а не его …   12.10.2006 19:16
klem4   Вот такое в FPC наверняка ведь можно сделать ? us…   12.10.2006 19:45
volvo   Ты про это: TPolinom = class public cons…   12.10.2006 19:55
klem4   Ага :yes2: а что это значит ?)))   12.10.2006 19:57
volvo   6.3.3 Class methods Class methods are methods that…   12.10.2006 20:05
klem4   Все время забываю про этот мануал :) Класс :) С…   12.10.2006 20:13
Altair   А в чем смысл вызова метода класса ? Ведь класс яв…   15.10.2006 17:47
klem4   Вот ты не прав. Зачем - то же умные люди дали нам …   15.10.2006 19:55
volvo   Олег, тривиальная задача: посчитать, сколько экзем…   15.10.2006 20:09
Altair   Вообще-то индивидульность объекта - одно из фунд…   16.10.2006 2:03
volvo   То, что выделено красным - несовместимо... Поним…   16.10.2006 3:42
klem4   А можно на fpc написать именно аналог кода приведе…   30.01.2007 19:00
volvo   Именно поэтому приходится работать не с полями кла…   30.01.2007 20:18
volvo   Хотя, естественно, обмануть компилятор можно: {…   30.01.2007 21:01
klem4   Здорово :) :good:   30.01.2007 21:52


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 19.04.2024 7:05
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name