Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Посоветуйте с ООП

513
15 декабря 2008 года
Yurec
228 / / 21.09.2005
Друзья посоветуйте как состроить такое наследие.

Есть Класс People и два его наследника Man и Woman:
Код:
type
  People = class
  public

  procedure Say ();
  procedure Think ();
end;


type
  Man= class(People  )
  private
  procedure Think ();
end;


type
  Woman= class(People )
  private
  procedure Think ();
end;



procedure People.Say  ();
begin
    Think ();
end;

procedure People.Think  ();
begin
// ничего не делать, просто заглушка
end;



procedure Man.Think  ();
begin
 // тут много думает мужчина
end;



procedure Woman.Think  ();
begin
 // тут много думает женщина
end;




Суть в том, что у обоих наследников есть общая сложная функция Say, которая определена в классе People, которую они и наследуют.
Разница только в том, что когда вызывавется унаследовання ф-ция Say сначала должна выполниться ф-ция Think. Как сделать так, чтобы ф-ция Think вызывалась для каждого наследника своя, НО чтобы ф-ция Say была унаследована.
3.7K
15 декабря 2008 года
0nni
326 / / 24.06.2008
Код:
type
  People = class
  public

  procedure Say ();
  procedure Think (); virtual; abstract; //объявляем как виртуальную абстактную
end;


type
  Man= class(People  )
  private
  procedure Think (); override; //после этого наследники могут перезаписывать этот метод
end;


type
  Woman= class(People )
  private
  procedure Think (); override;//после этого наследники могут перезаписывать этот метод
end;
513
16 декабря 2008 года
Yurec
228 / / 21.09.2005
Спасибо. Все заработало
513
17 декабря 2008 года
Yurec
228 / / 21.09.2005
А есть ли такой абстрактный аналог для переменных?
То есть, например,
у меня есть еще один класс
Код:
type TMyPeopleList=class
// Общие методы для обработки списка людей (мужчин и женщин)
end;

type TMyMansList=class(TMyPeopleList)
items array of Man;
// мужские методы
end;

type TMyWOMansList=class(TMyPeopleList)
items array of WoMan;
// женские методы
end;


То есть фактически я хочу иметь два класса TMyMansList и TMyWOMansList.
У каждого из них есть свои методы мужские и женские соответсвенно.
Но есть так же у них и общие методы (например, посчитать кол-во элементов и прочее). Для использования общих методов я создал класс TMyPeopleList с общими методами и от него двух вышеупомянутых наследников.

Теперь не ясно как быть дальше:
1. Чтобы определить и описать эти самые общие методы работы со списком надо сделать в TMyPeopleList список Items. Какого типа не ясно. Если сделать его типа People, а в TMyMansList и TMyWOMansList этот список убрать, то становится весьма мутарно потом работать с этими классами (потсоянгно надо пистаь приведение типа - with (param as TMyMansList ) do begin..)
2. Если в TMyPeopleList список Items сделать типа People, а в TMyMansList, TMyWOMansList этот список переопределить, то потом все общие методы становятся неработоспособными, так как они будут работать с iTems TMyPeopleList, который не заполнен остается

Если кто-нибудь знает как выйти из этой ситуации, то просьба посоветовать как... (
14
17 декабря 2008 года
Phodopus
3.3K / / 19.06.2008
Если я правильно понял что требуется..
Сделай Items не массивом, а классом с индексированным default-свойством. У этого класса также будет 2 наследника.
513
17 декабря 2008 года
Yurec
228 / / 21.09.2005
Цитата: Phodopus
Если я правильно понял что требуется..
Сделай Items не массивом, а классом с индексированным default-свойством. У этого класса также будет 2 наследника.



А конкретнее не могли бы показать, я чтото никак не найду что это такое и с чем его едят.

14
17 декабря 2008 года
Phodopus
3.3K / / 19.06.2008
Гляньте свойство .Items у, например, TListView
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог