2017-01-25 3 views
2

Как вызывать функции из отдельных родительских классов, функция должна иметь то же имя, что и в родительском классе.Функции вызова Delphi с разных уровней классов

В Java есть ключевое слово super, в C# есть base. Что эквивалентно в Delphi?

type 
    MyParentClass = class 
    function Dosomething: Integer; 
    end; 

    MyChildClass = class(MyParentClass) 
    function DoSomething: Integer; 
    end; 

    MyGrandChildClass = class(MyChildClass) 
    function DoSomething: Integer; 
    end; 


function MyParentClass.Dosomething : Integer; 
begin 
     result := 5; 
end; 


function MyChildClass.Dosomething : Integer; 
begin 
     result := Dosomething + 15 ; // result should be 20 ! 
end; 


function MyGrandChildClass.Dosomething : Integer; 
begin 
     result := Dosomething + 40 ; // result should be 60 ..... 
end; 
+0

следует исправить сейчас – user1769184

+0

Связанный: http://stackoverflow.com/questions/12505695/how-to-access-base-super-class-in-delphi –

ответ

3

Используйте inherited ключевое слово:

function MyChildClass.DoSomething : Integer; 
begin 
    result := inherited DoSomething + 15 ; 
end; 

Читайте об этом ключевом слове в documentation.

Если вы хотите выбрать класс дальше по цепочке наследования, вы должны указать его явно. Например:

function MyGrandChildClass.DoSomething : Integer; 
begin 
    result := MyParentClass(Self).DoSomething + 15 ; 
end; 

Обратите внимание, что все это очень сильный запах кода. В каждом производном классе вы скрываете метод с тем же именем. Обычно это нужно делать с помощью виртуального метода.

+0

Главный вопрос: как вызвать функцию из MyParentClass? 'inherited Dosomething' вызывает только от последнего родителя. – Zam

+1

@Zam Не мое чтение. В конце концов, вопрос явно ссылается на 'base' из C#. –