| 
| 
 | Вопрос # 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ндрей (статус: 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ндрей (статус: 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ндрей (статус: 1-ый класс), 19 декабря 2008, 16:45 [#3]:говорит, что такое объявление переменных недопустимо IOne = interface
 Am: Integer;
 You: Double;
 end;
 |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |