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

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

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

Delphi.int.ru Expert

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

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

#   

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


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

Подробнее »



Вопрос # 2 212

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

Здравствуйте!
Не получается, разобраться с множественным наследованием.
Почитал. но все равно не понятно


Подскажите плиз на примере

Есть класс
TOne = class
Public Am: Integer;
protected You: Double;
end;

Второй класс
TBase = class
Public Other: Double;
End;

Третий класс

TThree = class
Public They: string;
End;


Требуется, чтобы класс TThree содержал поля остальных двух классов

Спасибо

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

Вопрос задал: Aндрей (статус: 1-ый класс)
Вопрос отправлен: 19 декабря 2008, 12:30
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: Вадим К

Здравствуйте, Aндрей!
Делфи не поддерживает множественного наследования. Оно обычно вызывает только неоднозначности.
Но если сильно хочеться, то можно сделать цепочку наследования

TOne = class
Public Am: Integer;
protected You: Double;
end;
 
Второй класс 
TBase = class(TOne)
Public Other: Double;
End;
 
Третий класс 
 
TThree = class(TBase)
Public They: string;
End;
Есть второй вариант - использовать интерфесы. Так как ваши два класса не содержат методов, то это будет вполне подобно "сиплюсплюсному" множественному наследованию. В целом это выглядит где то так
IOne = interface
Am: Integer;
You: Double;
end;

Второй класс
IBase = interface
Other: Double;
End;

Третий класс

TThree = class(TObject, IOne, IBase)
Public They: string;
End;
Но при этом есть две проблемы. Интерфесы имеют только публичные методы. во вторых методы, которые они определяют, прийдётся реализовать в классе.
И есть третий вариант. Он считается наиболее правильным многими апологетами. Это включение. Где то так
Третий класс
TThree = class
private
 base:TBase;
 one:TOne;
public
 They: string;
End;
Правда надо не забыть в конструкторе создать эти классы и в деструкторе разрушить. Если же внешнему коду нужны методы включенных классов - просто делается функция-переходник. и всех делов.
P.S. Судя по форме записи кода, портируем с С++?

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 19 декабря 2008, 13:19
Оценка за ответ: 5

Комментарий к оценке: спасибо за ответ. очень помогли

Мини-форум вопроса

Всего сообщений: 4; последнее сообщение — 19 декабря 2008, 16:55; участников в обсуждении: 2.
Aндрей

Aндрей (статус: 1-ый класс), 19 декабря 2008, 15:53 [#1]:

Такой вариант не работает
IOne = interface
Am: Integer;
You: Double;
end;

Второй класс
IBase = interface
Other: Double;
End;

Третий класс

TThree = class(TObject, IOne, IBase)
Public They: string;
End;
Вадим К

Вадим К (статус: Академик), 19 декабря 2008, 15:56 [#2]:

не работает - это как, не компилируется, не работает так, как хочеться, что именно? я пишу без компилятора, проверить пока не могу. всё по памяти
Галочка "подтверждения прочтения" - вселенское зло.
Aндрей

Aндрей (статус: 1-ый класс), 19 декабря 2008, 16:45 [#3]:

говорит, что такое объявление переменных недопустимо
IOne = interface
Am: Integer;
You: Double;
end;
Вадим К

Вадим К (статус: Академик), 19 декабря 2008, 16:55 [#4]:

давно я интерфесы не писал. вот http://www.delphisources.ru/pages/faq/faq_delphi_basics/Interface.php.html описание их, если не поймёте, пишите, попробуем разобрать.
в интерфесе не может быть просто переменной. там либо методы, либо свойства. Так вроде.
Галочка "подтверждения прочтения" - вселенское зло.

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

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 марта 2023, 06:48
Выполнено за 0.03 сек.
Рейтинг@Mail.ru