| 
| 
 | Вопрос # 4 070/ вопрос открыт / | 
 |  Доброго времени суток, уважаемые эксперты!Нужно скрыть поля класса (свойства и методы родительского класса), оставить только свои. Подкиньте плиз статью или свой примерчик.
 
|  |   Вопрос задал: Roman Novikov (статус: Посетитель)Вопрос отправлен: 20 апреля 2010, 22:16
 Состояние вопроса: открыт, ответов: 1.
 |  Ответ #1. Отвечает эксперт: Вадим К Здравствуйте, Roman Novikov!Если наследуемся, то скрыть методы/свойства предков нельзя (по крайней мере в делфи). это идея ООП. Иначе наследование и полиморфизм не могут нормально работать.
 Если же хочется и волков покормить, и овец с пастухом целых оставить, то применяют делегирование. В этом случае класс, от которого наследуются является приватным полем. В констукторе создаем, в деструкторе удаляем наш "наследуемый объект".
 
 В делфи есть некоторые хаки, которые позволяют скрыть отдельные методы/свойства, но их использование чревато различными спецэффектами и очень не рекомендовано к использованию.
 
 Пример хорошего делегирования
 
 type 
TBase = class
  //...
end;
 
TNew =class
private
  base:TBase;
public
  constructor create;
  destructor destroy;
end;
//
constructor TNew.create;
begin
  base := TBase.create;
end;
 
destructor TNew.Destroy;
begin
  base.free;
end; 
|  | Ответ отправил: Вадим К (статус: Академик)Время отправки: 20 апреля 2010, 22:49
 Оценка за ответ: 5
 |  
 Мини-форум вопросаВсего сообщений: 6; последнее сообщение — 20 апреля 2010, 23:10; участников в обсуждении: 3. 
|   | min@y™ (статус: Доктор наук), 20 апреля 2010, 22:31 [#1]:От чего скрыть-то? От Object Inspector? Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Roman Novikov (статус: Посетитель), 20 апреля 2010, 22:48 [#2]:К примеру описал в модуле класс на основе базового... В других модулях если использовать его, то в полях объектов присутствуют все поля из базового класса, а мне нужно оставить только свои (а бзовые используются только при написании текущего класса). |  
|   | Roman Novikov (статус: Посетитель), 20 апреля 2010, 22:56 [#3]:С делегированием все понятно. Но представители классов TBase и TNew будут содержать все свойства и методы Object, а хотелось бы скрыть их чтобы пользователь класса мог видеть только интерфейс который я предоставил. |  
|   | min@y™ (статус: Доктор наук), 20 апреля 2010, 22:58 [#4]:Ну, кроме, как перенести из public в private, ничего в голову не приходит. Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Вадим К (статус: Академик), 20 апреля 2010, 23:02 [#5]:Нельзя скрыть. и точка. это закон. Если все таки обойти и скрыть, то делфи не сможет работать с Вашим классом.
 
 Но есть ещё один метод - называется интерфейс. Он позволяет сделать "чистый класс". (ну почти). Правда он не совсем класс, но...
 озвучьте цели такого изврата.
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | min@y™ (статус: Доктор наук), 20 апреля 2010, 23:10 [#6]: Цитата (Вадим К): озвучьте цели такого изврата.  О, да, мне тоже интересно.
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |