|
Вопрос # 377/ вопрос открыт / |
|
Здравствуйте! Продолжая вопрос 373 напишу новый. У меня есть три класса. Класс TDocument содержит в себе массив "объектных векторов" - ObjectsVector.
Итак первый ворос как мне получить колисчество этих "объектных векторов", таким образом:
Document.ObjectsVectors.Count, чтобы одновремено можно было обратиться к каждому "объектному вектору"?: Document.ObjectsVectors := TObjectsVector.create (Document.ObjectsVectors.Add)
И одновременно с этим получить количество линий в "объектном векторе"?:
Document.ObjectsVectors.Count
Заметьте, что я использую список линий, т.е. мне нужно реализовать только "интерфейс" к каждой линии:
Document.ObjectsVectors.VectorPoint.Count (получить количество точек в линии в i объектном векторе)
И последнее, получить доступ и изменить точку в линии:
Document.ObjectsVectors.VectorPoint[j].x := X
Document.ObjectsVectors.VectorPoint[j].y := Y
Я пробовал реализовывать через наследование, используя абстрактные методы, ничего не получилось, уже главу про класса прочил не один раз, не могу понять как это реализовано, например в tmemo (memo.Lines.count, memo.lines := s).
Может кто-нибудь объяснить как это реализуется?
Приложение: Переключить в обычный режим- type
- PVector = ^TVector;
- TVector = packed record
- n: Word;
- pt: TArrPoint;
- C: TArrSingle;
- Sled: PVector;
- id: word;
- end;
- //-------------------------------------------------------------//
- TVectorPoint = class
- private
- //
- protected
- function GetCount(): word; virtual; abstract;
- function GetPoint(Index: word): TPoint; virtual; abstract;
- procedure SetPoint(Index: word; NewPoint: TPoint); virtual; abstract;
- public
- procedure Add(Point: TPoint); virtual; abstract;
- procedure Del(Index: word); virtual; abstract;
- procedure Clear(); virtual; abstract;
- property Count: word read GetCount;
- property Point[Index: word]: TPoint read GetPoint write SetPoint;
- end;
- //-------------------------------------------------------------//
- TObjectVector = class
- private
- FRoot, FLast: Pointer;
- FVectors: PVector;
- FCount: longword;
- FName: string;
- FVectorPoint: TVectorPoint;
- protected
-
- function GetCount(): word; override;
- function GetPoint(Index: word): TPoint; override;
- procedure SetPoint(Index: word; NewPoint: TPoint); override;
-
- public
- constructor Create();
- destructor Destroy(); override;
-
- procedure AddVector(Point: TPoint);
- procedure DelVector(index: word);
-
- procedure AddPoint(index: word; Point: TPoint);
- //procedure DelPoint(index: word);
- procedure Paint(Canvas: TCanvas);
-
- //------------------------------//
- procedure Add(Point: TPoint); override;
- procedure Del(Index: word); override;
- procedure Clear(); override;
-
- property VectorPoint: TVectorPoint read FVectorPoint;
- end;
-
- TObjectsVector = array of TObjectVector;
-
- TDocument = class
- private
- ObjectsVector: TObjectsVector;
- Count: word;
- //NetSize: word;
- protected
-
- public
- constructor Create();
- destructor Destroy(); override;
-
- procedure AddObject();
- procedure DelObject(index: word);
- //procedure AddPoint
-
- procedure Paint(Canvas: TCanvas);
- end;
-
 |
Вопрос задал: SMaks (статус: 1-ый класс)
Вопрос отправлен: 4 марта 2007, 19:11
Состояние вопроса: открыт, ответов: 2.
|
Ответ #1. Отвечает эксперт: Вадим К
У вас в голове откровенно каша. Вы хотите использовать абстракный класс, не реализовав эти методы.
К примеру, у вас ест
procedure Add(Point: TPoint); virtual; abstract;
Этот метод вызвать нельзя.!
Его можно вызвать только в наследнике, который его реализует.
Во вторых, непонятно ваше желания использовать списки. Это даст медленый произвольный доступ к элементам и подсчёт общего количества элементов.
Также мне непонятен метод procedure AddObject();
Куда он добавляет? Что добавляет?
Назначение TVectorPoint, которому нужно реализовать заданую функциональность, вообще стоит боком Его назначение для меня загадка. Он как 5 колесо для воза. Ещё раз скажу, у вас большие проблемы с проектированием классов.
К тому же я не понимаю разницу между методами
procedure AddVector(Point: TPoint);
procedure AddPoint(index: word; Point: TPoint);
А также фунциональность, которая на них положена.
Нужно перепроектировать классы.
А потом реализовать методы.
 |
Ответ отправил: Вадим К (статус: Академик)
Время отправки: 4 марта 2007, 22:57
Оценка за ответ: 4
Комментарий к оценке: Да я все перепробовал, этот код - уже переделывался много раз, а также я прекрасно знаю, что абстрактные методы нельзя вызывать, я лишь пытался его перекрыть в потомке. Используя списки - я выгрываю в добавлении, удалении в середину элементов. Посчет элементов производиться заранее. Вот я этим и занимаюсь: пытаюсь спроектировать удобный и защищенный класс. Вообщем я задал конкретный вопрос! Я не прошу писать здоровые классы, мне нужно всего лишь небольшой примерчик, полностью поясняющий суть.
|
Ответ #2. Отвечает эксперт: min@y™
Набросал ОЧЕНЬ сильно упрощённый примерчик, буквально на коленке. Это не руководство к действию, но я работаю уже много лет именно так. См. приложение.
Приложение: Переключить в обычный режим-
- interface
-
- type
-
- TLine = class
- private
- FBeginPt,
- FEndPt: TPoint;
- public
- constructor Create(const ABegin, AEnd: TPoint);
- property BeginPt: TPoint read FBeginPt write FBeginPt;
- property EndPt: TPoint read FEndPt write FEndPt;
- end;
-
-
- TLineList = class(TList)
- public
- function AddLine(const ABegin, AEnd: TPoint): TLine;
- end;
-
- {
-
-
- TLineList.Count;
-
-
- TLineList.Move;
-
- }
-
- implementation
-
- constructor TLine.Create(const ABegin, AEnd: TPoint);
- begin
- inherited;
- FBeginPt:= ABegin;
- FEndPt:= AEnd;
- end;
-
- function AddLine(const ABegin, AEnd: TPoint): TLine;
- begin
- Result:= TLine.Create(ABegin, AEnd);
- end;
 |
Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 5 марта 2007, 09:11
Оценка за ответ: 4
|
Мини-форум вопроса
Всего сообщений: 2; последнее сообщение — 5 марта 2007, 09:20; участников в обсуждении: 2.
|
Вадим К (статус: Академик), 4 марта 2007, 23:34 [#1]:
Ваши классы ужасно спроектированы. Мне не совсем понятны некоторые методы. Если вы хотите получить более подробный коментарий - стучите в асю.
Примерчик - по данному коду его сочинить нельзя, так как классы просто нерабочие. Хотя я может немного ощибаюсь, так как я не видел реализаций методов. Но я не видел наследников.
А оценка. Лучше бы вы не ставили её, так как это оценка вам, а не мне.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
min@y™ (статус: Доктор наук), 5 марта 2007, 09:20 [#2]:
СОРРИ, так как писал на коленке, забыл кое-что:
function TLineList.AddLine(const ABegin, AEnd: TPoint): TLine;
begin
Result:= TLine.Create(ABegin, AEnd);
Self.Add(Pointer(Result));
end;
{
Доступ к элементам:
var
BP: TPoint;
begin
BP:= TLine(TLineList[Index]).BeginPt;
end;
}
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|