Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ООП в Delphi XE, Как реализовать несколько классов 
V
    Опции темы
Elfix
Дата 15.11.2012, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 167
Регистрация: 13.7.2005

Репутация: нет
Всего: нет



Всем привет!

Возникла проблема, подскажите возможно ли такое реализовать?
Предположим, есть несколько классов: Government, City, Contragent.

TGovernment - это класс для работы с объектами, который реализует несколько методов, например, получение имени государства, формирование списка городов, формирование списка организаций (контрагентов), которые находятся внутри этого государства, получение налоговых ставок и т. д.

TCity - реализует получение имени города, формирование списка организаций, которые находятся внутри этого города, получение объекта государства в котором этот город существует и после послучения работать с методами этого (государства) объекта, как например, получение налоговой ставки и т. д....

TContragent - реализует получение имени контрагента, получение объекта Город, в котором находится данный контрагент, получение объекта Государство и т. д.

Смысл в том, что на Delphi такое реализовать не получается. Ведь классы ссылаются друг на друга, а по правилам языка каждый класс должен быть предварительно (сверху) объявлен. Но материальный мир устроен так, что кто-то один может находиться сверху, а другой относительно него всегда окажется снизу.

Привожу свой код:

Код

unit Unit2;

interface

type

  TCity = class
  private
    FId: Integer;
    FName: string;
  public
    constructor Create(Id: Integer);
    function GetName(): string;
  end;

  TCitiesList = array of TCity;

  TGovernment = class
  private
    FId: Integer;
    FName: string;
    FCities: TCitiesList;
    FNalog: Double;
  public
    constructor Create(Id: Integer);
    function GeyName(): string;
    function GetCities(): TCitiesList;
    function GetNalog(): Double;
  end;

  TContragent = class
  private
    FId: Integer;
    FName: string;
    FGovernment: TGovernment;
    FCity: TCity;
  public
    constructor Create(Id: Integer);
    function GetName(): string;
    function GetGovernment(): TGovernment;
  end;

implementation

Суть поста.

1. Возможно ли в классе TGovernment создать поле FContragents типа TContragentsList, который в свою очередь является типом TContragentsList = array of TContragent.
2. Возможно ли в вклассе TCity создать поле FGovernment типа TGovernment?

Поясню зачем все это. Мне необходимо создать набор универсальных классов, позволяющих работать с ними в зависимости от контекста разными способами. Например, чтобы было возможно делать так одновременно в одном куске кода:

Код

  // Получить наименование второго города в списке городов государства
  Government.GetCities()[1].GetName;
  // Получить наименование третьего контрагента в государстве игнорируя местонахождение по городу
  Government.GetContragents()[2].GetName;
  // Получить налог конкретного государства для 5-го контрагента, который находится в конкретном городе
  City.GetContragents()[4].GetGovernment().GetNalog;


Есть идеи?

Добавлено через 8 минут и 32 секунды
Прошу прощения, тема должна была называться ООП в Delphi XE
PM MAIL   Вверх
northener
Дата 15.11.2012, 15:55 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 8
Всего: 20



Цитата(Elfix @  15.11.2012,  15:36 Найти цитируемый пост)
Смысл в том, что на Delphi такое реализовать не получается. Ведь классы ссылаются друг на друга, а по правилам языка каждый класс должен быть предварительно (сверху) объявлен.

Для этого существует понятие Forward declaration.

Код

type
  TCity = class;
  TGovernment = class;
  TContragent = class;

  TCity = class
  private
    FId: Integer;
    FName: string;
    FGovernment: TGovernment;
    FContragent: TContragent;
  public
    constructor Create(Id: Integer);
    function GetName(): string;
  end;
  TCitiesList = array of TCity;
  TGovernment = class
  private
    FId: Integer;
    FName: string;
    FCities: TCitiesList;
    FNalog: Double;
  public
    constructor Create(Id: Integer);
    function GeyName(): string;
    function GetCities(): TCitiesList;
    function GetNalog(): Double;
  end;
  TContragent = class
  private
    FId: Integer;
    FName: string;
    FGovernment: TGovernment;
    FCity: TCity;
  public
    constructor Create(Id: Integer);
    function GetName(): string;
    function GetGovernment(): TGovernment;
  end;


Это сообщение отредактировал(а) northener - 15.11.2012, 16:00


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
Elfix
Дата 15.11.2012, 16:30 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 167
Регистрация: 13.7.2005

Репутация: нет
Всего: нет



Круто! Спасибо!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0417 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.