Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 4 070

/ вопрос открыт /

Доброго времени суток, уважаемые эксперты!
Нужно скрыть поля класса (свойства и методы родительского класса), оставить только свои. Подкиньте плиз статью или свой примерчик.

Roman Novikov Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: 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™

min@y™ (статус: Доктор наук), 20 апреля 2010, 22:31 [#1]:

От чего скрыть-то? От Object Inspector?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Roman Novikov

Roman Novikov (статус: Посетитель), 20 апреля 2010, 22:48 [#2]:

К примеру описал в модуле класс на основе базового... В других модулях если использовать его, то в полях объектов присутствуют все поля из базового класса, а мне нужно оставить только свои (а бзовые используются только при написании текущего класса).
Roman Novikov

Roman Novikov (статус: Посетитель), 20 апреля 2010, 22:56 [#3]:

С делегированием все понятно. Но представители классов TBase и TNew будут содержать все свойства и методы Object, а хотелось бы скрыть их чтобы пользователь класса мог видеть только интерфейс который я предоставил.
min@y™

min@y™ (статус: Доктор наук), 20 апреля 2010, 22:58 [#4]:

Ну, кроме, как перенести из public в private, ничего в голову не приходит.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Вадим К

Вадим К (статус: Академик), 20 апреля 2010, 23:02 [#5]:

Нельзя скрыть. и точка. это закон.
Если все таки обойти и скрыть, то делфи не сможет работать с Вашим классом.

Но есть ещё один метод - называется интерфейс. Он позволяет сделать "чистый класс". (ну почти). Правда он не совсем класс, но...
озвучьте цели такого изврата.
Галочка "подтверждения прочтения" - вселенское зло.
min@y™

min@y™ (статус: Доктор наук), 20 апреля 2010, 23:10 [#6]:

Цитата (Вадим К):

озвучьте цели такого изврата.

О, да, мне тоже интересно.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:47
Выполнено за 0.03 сек.