Почему я не могу напрямую вызвать метод класса ? 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.
А что, собственно, тебя смущает? Ты данные какого экземпляра хочешь напечатать? Из твоей конструкции этого не видно... Вот так - видно:
P.PrintCoeffs(test);
Нет, я хочу вызвать именно метод класса, а не его бъекта, вот как напирмер вызов конструктора
TPlonom.Create(n);
Вот такое в FPC наверняка ведь можно сделать ?
Ты про это:
TPolinom = class
public
constructor Create(const n: Word);
destructor Destroy;
procedure ReadCoeffs;
CLASS procedure PrintCoeffs(const c: TCoeffs);
function GetDerivative(const c: TCoeffs): TCoeffs;
function GetCoeffs: TCoeffs;
property C: TCoeffs read GetCoeffs;
private
coeffs: TCoeffs;
end;
...
TPolinom.PrintCoeffs(test);
...
Ага а что это значит ?)))
Все время забываю про этот мануал
Класс
Спасибо !
А в чем смысл вызова метода класса ? Ведь класс является множеством объектов, связанных общностью структуры и поведения.
Любой объект является экземпляром класса и имеет индивидуальность, в отличии от класса.
Зачем обращаться к сущности, не имеющей индивидуальности ?
Вот ты не прав. Зачем - то же умные люди дали нам возможность так писать программы ... Да и примеров таких методов не мало. Сущность без индивидуальности... это ты куда-то не туда копать начал, мне кажется
Олег, тривиальная задача: посчитать, сколько экземпляров моего класса создано в программе...
Твое решение без Class Methods ?
{$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.
obj_1.set_VAT(0.19);, а вот так:
T.set_VAT(0.19);, потому, что налог распространяется НЕ на один какой-то экземпляр услуги, а на весь ее тип !!!
А можно на fpc написать именно аналог кода приведенного мною на шарпе ? Чтобы для всех экземпляров существовала единая статическая переменная - счетчик, которая находилась бы внутнри описания класса ?
Или на обжэкт паскале такое нельзя замутить ?
Добавлено через 5 мин. 42 сек.
В сети пока везде нахожу только один и тотже пример на подобии приведенного volvo (размещать счетчик ну или просто какую-то общую переменную в имплементейшн разделе модуля)
вот он например
http://www.cracklab.ru/pro/faq.php?pg=3586
Хотя, естественно, обмануть компилятор можно:
{$mode ObjFPC}
type
T = class
constructor init();
class function count(access: boolean): integer;
class function get_count(): integer;
end;
constructor T.init();
begin
count(true);
end;
class function T.count(access: boolean): integer;
const
counter: integer = 0;
begin
if access then inc(counter);
count := counter;
end;
class function T.get_count(): integer;
begin
get_count := count(false);
end;
{ main }
const
n = 10;
var
arr: array[1 .. n] of T;
i: integer;
begin
for i := 1 to 7 do arr[i] := T.init();
writeln(T.get_count(), ' init calls ...');
end.
Здорово