|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Помогите с полиформизмом
Здрасте! ЗНАЮЩИЕ, помогите пожалуйста начинающему. Не могу разобраться с наследованием классов. Допустим есть три класса:
Код:
unit UnitBase; interface type BaseClass3=class end; BaseClass2=class end; BaseClass1=class end; implementation end. Код:
unit Unit3; interface uses UnitBase; type Class3 = class (BAseClass3) Owner:BaseClass1; S:String; constructor Create(aOwner:BaseClass1); end; implementation constructor Class3.Create(aOwner: BaseClass1); begin Owner:=aOwner; S:='Class3'; end; end. Код:
unit Unit2; interface uses UnitBase; type Class2 = class (BAseClass2) Owner:BaseClass1; S:String; constructor Create(aOwner:BaseClass1); end; implementation constructor Class2.Create(aOwner: BaseClass1); begin Owner:=aOwner; S:='Class2'; end; end. Код:
unit Unit1; interface uses UnitBAse,Unit2,Unit3; type Class1=Class(BaseClass1) Value2:Class2; Value3:Class3; S:String; constructor Create; end; implementation constructor Class1.Create; begin Value2:=Class2.Create(Self); Value3:=Class3.Create(Self); S:='Class1'; end; end. Проблема такая, как реализовать следующий код в модуле Unit2: Код:
implementation ... var C:Class2; S:String; begin S:=C.Owner.Value3.S; пробовал объявлять BaseClass2 и BaseClass3 абстрактными но так и не получается А если в двух словах , то : как потомку получить полный доступ к методам и переменным предка если они описаны в разных модулях программы и предок ссылается на модуль потомка????? Последний раз редактировалось gerych, 07.12.2011 в 20:28. |
#2
|
|||
|
|||
может так
S:=(C.Owner as Class1).Value3.S; |
#3
|
|||
|
|||
Дело в том что в USES нельзя написать модуль Unit1 так получается циркуляция, которую использовать крайне не хочется. Тут нужен подход полиформизма. Так что S:=(C2.Owner as Class1).Value3.S; тут не работает
Последний раз редактировалось gerych, 07.12.2011 в 12:13. |
#4
|
||||
|
||||
Цитата:
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#5
|
|||
|
|||
Цитата:
может тогда подскажете как? |
#6
|
||||
|
||||
Просто определись, что прописывать в секции INTERFACE, а что в IMPLEMENTATION, чтобы не было циркулярной ссылки.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#7
|
|||
|
|||
Цитата:
|
#8
|
|||
|
|||
Проблема решена путем объявления в базовых классах переменных и методов которые требуются в других модулях. На все методы поставил заглушки abstract; Спасибо всем кто не прошел мимо.
|