|
Вопрос # 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. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|