Форум: "Основная";
Текущий архив: 2002.06.24;
Скачать: [xml.tar.bz2];
ВнизООП, блин... Найти похожие ветки
← →
Project1 (2002-06-09 23:54) [0]Есть вот такая штука:
Class_1=class
Data:Array Of Byte;
Procedure Use(size:Cardinal);
Function GetDataSize:Cardinal;
End;
Ну и методы:
Procedure class_1.use;
begin SetLength(data,size); end;
Function Class_1.GetDataSize:Cardinal;
begin result:=length(data); end;
Вроде бы все замечательно, но нет, т.к. есть еще такая штука:
Class_2=Class(class_1)
Data:Array of Boolean;
End;
И вот... Дальше...
var a:class_2;
begin
a:=class_2.create;
a.use(5);
showmessage(inttostr(length(a.data)));
end.
И выводится 0. А если ShowMessage(inttostr(a.getdatasize)) то 5.
Но при использовании a.use(5) память под data:array of boolean не выделяется.. если она вообще выделяется, то под что-то другое
Ну, короче - если провести аналогию с методами, то можно сказать, что здесь поле data должно быть виртуальным...
В общем, помогите...
← →
Walker (2002-06-10 02:12) [1]ну.... если ты хочешь чтоб выделялась память под Data во втором классе - то напиши для этого соответствующую функцию, типа
Procedure Use(size:Cardinal); override;
и соответствующую функцию GetSize
а если ты хочешь чтоб к массиву был доступ как к массиву байтов, то можно сделать так:
var
a, i: Byte;
begin
....
a := Byte(Data[i]);
....
end;
Потом, виртуальными можно делать тлько методы, если тебе надо обратиться к полю родительского класса, помести его (поле в род. классе) под зарезервированным словом protected (или вообще public)
← →
Project1 (2002-06-10 03:10) [2]
> Потом, виртуальными можно делать тлько методы, если тебе
> надо обратиться к полю родительского класса, помести его
> (поле в род. классе) под зарезервированным словом protected
> (или вообще public)
Я же сказал - анология...
> ну.... если ты хочешь чтоб выделялась память под Data во
> втором классе - то напиши для этого соответствующую функцию,
> типа
> Procedure Use(size:Cardinal); override;
> и соответствующую функцию GetSize
а если ты хочешь чтоб к массиву был доступ как к массиву байтов, то можно сделать так:
var
a, i: Byte;
begin
....
a := Byte(Data[i]);
....
end;
Я сам немного не дописал, и, как следствие, был понят не совсем верно. Фишка вся в том, что бы не переписывать эти методы, если их писать для каждого класса свои тут не нужен никакой override... Надо что-бы методы родителя работали с полем-потомком, который имеет такое же имя как и в родителе... Вот...
← →
MBo (2002-06-10 08:15) [3]Примерно так принято делать в ООП (набросок)
type
TA=class
private
FData:Array of Integer;
function GetLen:integer;
procedure SetLen(const Value: integer);
function GetIntData(Index: Integer): Integer;
procedure SetIntData(Index: Integer; const Value: Integer);
public
property Data[Index:Integer]:Integer read GetIntData write SetIntData;default;
published
property Len:integer read GetLen write SetLen;
end;
TB=class(TA)
private
FData:Array of Boolean;
function GetBoolData(Index: Integer): Boolean;
procedure SetBoolData(Index: Integer; const Value: Boolean);
public
property Data[Index:Integer]:Boolean read GetBoolData write SetBoolData;
end;
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
var a:ta;
b:tb;
begin
a:=ta.create;
b:=tb.create;
a.Len:=5;
b.len:=5;
a[4]:=-2002;
b.data[0]:=true;
label1.caption:="a:"+inttostr(a.len);
label2.caption:="b:"+inttostr(b.len);
label3.caption:="a[4]="+inttostr(a[4]);
a.free;
b.free;
end;
{ TA }
function TA.GetIntData(Index: Integer): Integer;
begin
if Index<=High(FData) then Result:=FData[index];
end;
function TA.GetLen: integer;
begin
Result:=Length(FData);
end;
procedure TA.SetIntData(Index: Integer; const Value: Integer);
begin
if index>High(FData) then setlength(FData,index+1);
FData[index]:=Value;
end;
procedure TA.SetLen(const Value: integer);
begin
SetLength(FData,Value);
end;
{ TB }
function TB.GetBoolData(Index: Integer): Boolean;
begin
if Index<=High(FData) then Result:=FData[index];
end;
procedure TB.SetBoolData(Index: Integer; const Value: Boolean);
begin
if index>High(FData) then setlength(FData,index+1);
FData[index]:=Value;
end;
← →
cpp (2002-06-10 08:43) [4]То что Вы, уважаемый, хотите получить - невозможно. В ООП можно только переопределить поведение процедуры и только с теми данными которые находятся в её области видимости.
В процедуре class_1.use виден только Data:Array Of Byte. Поэтому у тебя такой результат.
В твоём случае единственный выход - это создать абстракную функцию, возвращающую твой массив. И извращайся с ним на здоровье.
← →
Project1 (2002-06-10 12:06) [5]
> Поэтому у тебя такой результат.
Да знаю я почему такой результат...
> В твоём случае единственный выход - это создать абстракную
> функцию, возвращающую твой массив. И извращайся с ним на
> здоровье
Поподробнее.. pls...
← →
cpp (2002-06-10 13:23) [6]Поля какого типа (конкретно) ты предполагаешь использовать?
← →
cpp (2002-06-10 13:28) [7]Хотя тут мысль пришла.
А не стоит тебе обратить свой взор на вариантный массивы. Тогда ты сможешь хранить всё что захочешь и либого типа.
← →
Project1 (2002-06-10 22:28) [8]
> Поля какого типа (конкретно) ты предполагаешь использовать?
В программе - array of Byte и array of TSimpleData, где TSimpleData - некоторый класс... Но это не важно... Если решение есть, от типов это не должно зависеть...Теоретически...
> Хотя тут мысль пришла.
> А не стоит тебе обратить свой взор на вариантный массивы.
> Тогда ты сможешь хранить всё что захочешь и либого типа.
Пойду читать про Variant. Сейчас ничего сказать не могу. :)
← →
Project1 (2002-06-13 00:42) [9]Нет.Хрен.Никакой Variant тут не прокатит...Мда... И что делать?..
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.06.24;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.014 c