2017-02-10 7 views
4

Во всех случаях я помню, следующие инструкции дают тот же результат:В чем разница между InheritsFrom и оператором is?

type 
    TMyClass = class(TObject); 
    TMyChildClass = class(TMyClass); 

var 
    MyObj : TMyChildClass; 

procedure TForm1.Test(); 
var 
    ResultA : Boolean; 
    ResultB : Boolean; 
begin 
    //Using TObject.InheritsFrom 
    ResultA := MyObj.InheritsFrom(TMyClass); 

    //Using 'is' operator 
    ResultB := MyObj is TMyClass; 

    //Showing results 
    ShowMessage(
    'InheritsFrom = ' + BoolToStr(ResultA, True) + sLineBreak + 
    'is = ' + BoolToStr(ResultB, True) 
); 
end; 

Есть ли какая-то разница в использовании оператора is вместо TObject.InheritsFrom функции?

ответ

4

Оператор is построен на высоте InheritsFrom. Так,

obj is TSomeClass 

реализуется как

(obj <> nil) and obj.InheritsFrom(TSomeClass) 

Выражение obj.InheritsFrom(TSomeClass), возможно, немного сбивает с толку, потому что это выглядит как InheritsFrom это метод экземпляра. Фактически InheritsFrom - это метод класса, а класс времени выполнения obj передается InheritsFrom в качестве указателя Self.

Таким образом, принципиально is и InheritsFrom выполняют ту же задачу, по крайней мере, ограничивая внимание классами. Обратите внимание, что is является более общим и может также использоваться с интерфейсами, например.

Существуют очевидные синтаксические различия. А именно, что is требует экземпляра, тогда как InheritsFrom является функцией класса. Хотя, как мы видели, язык Delphi поддерживает вызовы функций класса в ссылках экземпляров. И другая очевидная разница в том, что is имеет встроенный тест для ссылки nil.

Это просто синтаксические различия, хотя фундаментальная операция такая же, о чем свидетельствует тот факт, что is звонит InheritsFrom.

6

Да, есть разница. InheritsFrom - функция класса, и основной целью является тестирование класса IS (наследуется от некоторого класса).

Вы не можете использовать is оператор на классах.

TMyChildClass is TMyClass не компилируется, но вы можете использовать TMyChildClass.InheritsFrom(TMyClass).

+0

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

+0

В этом смысле я имею в виду, что в некоторых сценариях они могут достичь одинаковых результатов! – Fero