Проблема не в объявлениях интерфейса или реализации классов, а в коде вашего потребителя:
procedure CallDoSomething(Parent: TParent);
begin
if Parent is TChild then
TChild(Parent).DoSomething; // << This is wrong
end;
Не будет работать, потому что TChild не имеет метода " DoSomething ».Если бы TChild реализовал IChild напрямую , то это было бы обычно возможным, потому что TChild будет реализовывать метод напрямую И как часть интерфейса IChild .
Обратите внимание, однако, что если TChild реализовано DoSomething в PRIVATE область будет оставаться доступной через интерфейс, но обычные правила области видимости означают, что вы все равно не можете вызвать ее (из-за пределов класса / uni), используя ссылку TChild либо.
В вашем случае вам просто нужно получить соответствующий интерфейс и затем вызвать метод, который вам требуется через интерфейс:
if Parent is TChild then
(Parent as IChild).DoSomething;
Однако вы используете тест типа класса дляопределить (вывести) наличие интерфейса, опираясь на детали реализации (знание, что TChild реализует IChild ).Я предлагаю вам вместо этого использовать тестирование интерфейса напрямую, чтобы изолировать эту зависимость от деталей реализации:
var
parentAsChild: IChild;
begin
if Parent.GetInterface(IChild, parentAsChild) then
parentAsChild.DoSomething;
end;