2015-07-28 2 views
-4

Я могу сделать это на других языках, которые я использую. Например, я могу сделать это в PHP, когда это необходимо для создания веб-приложений, но вот то, что я хочу сделать, и не может найти решение:Один интерфейс с несколькими реализациями в Delphi

Я хочу, чтобы определить интерфейс сказать:

unit myBigUnit; 

interface 

uses someUnits; 

type 
    TsampleType = class 
    someVar: Integer; 
    someOtherVar: Integer; 
    someObj: TneatObj; 
    procedure foo; 
    function bar : String; 
    procedure foobar(a: boolean); 

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

class blah implements thisInterface 

но я не могу найти эквивалент в Delphi. То, что я пытаюсь сделать, это реализовать это в одном блоке, а в другом - просто хочу, чтобы он знал об этих функциях/процедурах/et al, поэтому я могу позвонить им оттуда. Мне было все равно, как это реализовано. Я думал, что все это имеет смысл иметь интерфейсы и отделять их от разработчиков?

Как это сделать в Delphi?

+7

Рассматривали ли вы чтение документации Delphi об интерфейсах? У Delphi были их с конца 90-х годов, поэтому я могу только предположить, что вы просто не выглядели очень тяжело. –

+0

Я полностью согласен с Робом. Обратите внимание, что ваше объявление класса не объявляет интерфейс, он объявляет, как говорит название, класс. Классы IMPLEMENT интерфейсы, они не являются интерфейсами. В объявлениях интерфейса используется ключевое слово - неожиданность, сюрприз - интерфейс. –

+0

"Delphi Interfaces" не дал вам никаких результатов поиска? –

ответ

5

Вы необходимо использовать фактический интерфейс, например:

type 
    IsampleType = interface 
    procedure foo; 
    function bar : String; 
    procedure foobar(a: boolean); 
    end; 

У interface могут быть только методы и свойства, а не переменные.

Вы можете реализовать интерфейс в классах, как это необходимо, например:

type 
    TMyClass = class(TInterfacedObject, IsampleType) 
    public 
    someVar: Integer; 
    someOtherVar: Integer; 
    someObj: TneatObj; 
    procedure foo; 
    function bar : String; 
    procedure foobar(a: boolean); 
    end; 

var 
    Sample: IsampleType; 
begin 
    Sample := TMyClass.Create; 
    // use Sample as needed... 
end; 

интерфейсы Delphi являются подсчет ссылок. TInterfacedObject обрабатывает подсчет ссылок для вас. Он автоматически освобождает объект, когда счетчик ссылок падает до 0.

Вы можете найти более подробную информацию в документации в Delphi:

Object Interfaces Index

+0

Спасибо, что объяснили это более четко для меня. J .. выше ударил ноготь по голове о том, что Паскаль дважды использует ключевое слово для двух разных значений. –

3

Затем вы должны использовать интерфейс:

... 

type 
    IsampleType = Interface 
    ..... 

орудие это в своих классах:

type 
    TIntfType = class(TInterfacedObject, ISampleType) 
    .... 

и детали вы найдете с F1 в Delphi ...

+0

F1 не может произвести то, что вы ожидаете в Delphi XE8. –