Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.01 c
3-77269
Dorosh
2002-05-30 11:45
2002.06.24
Перенос mdb базы на MS SQL


14-77570
PVOzerski
2002-05-21 10:42
2002.06.24
Что-то не то в отображении списка ответов в


1-77489
SemFLY
2002-06-10 20:37
2002.06.24
Помогите разобраться !?


14-77563
cyborg
2002-05-19 19:18
2002.06.24
CoolTrayIcon, ver. 4.0.1- Delphi вылетает!


14-77611
hooch
2002-05-23 06:45
2002.06.24
Диаграмма Гантта





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский