|
Вопрос # 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;
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|