2016-06-03 4 views
1

У меня есть два интерфейса: ISomeInterfaceRO (только для чтения) и ISomeInterface.Delphi - интерфейс как другой интерфейс

ISomeInterfaceRO = interface(IInterface) ['{B28A9FB0-841F-423D-89AF-E092FE04433F}'] 
function GetTest: Integer; 
    property Test : integer read GetTest; 
end; 

ISomeInterface = interface(ISomeInterfaceRO) ['{C7148E40-568B-4496-B923-89BB891A7310}'] 
    procedure SetTest(const aValue: Integer); 
    property Test : integer read GetTest write SetTest; 
end; 

TSomeClass = class(TInterfacedObject, ISomeInterfaceRO, ISomeInterface) 
private 
    fTest: integer; 
protected 
    function GetTest: integer; 
    procedure SetTest(const aValue: integer); 
public 
    property Test: integer read GetTest write SetTest; 
end; 

function TSomeClass.GetTest: integer; 
begin 
    Result := fTest; 
end; 

procedure TSomeClass.SetTest(const aValue: integer); 
begin 
    fTest := aValue; 
end; 

Затем я использую только для чтения интерфейс, за исключением одного места, когда я создаю экземпляр TSomeClass как ISomeInterface и заполнить его. Пример:

Function GetSome: ISomeInterfaceRO; 
var 
    SomeInterface: ISomeInterface; 
begin 
    SomeInterface := TSomeClass.Create; 
    SomeInterface.Test := 10; 
    result := SomeInterface as ISomeInterfaceRO; 
end; 

Мой вопрос: что "результат: = SomeInterface в ISomeInterfaceRO;" безопасная и рекомендуемая конструкция? Или это еще один способ сделать это? Я отлаживал этот код, а компилятор правильно уменьшал количество ссылок на ISomeInterface и увеличивался до ISomeInterfaceRO, когда я использую «как».

+2

Это не право изменить вопрос после того, как был дан ответ. Вы должны принять лекарство и признать ошибку. В конце концов, я дал вам справедливое предупреждение о проблемах на G +. Теперь вам нужно задать новый вопрос. –

+1

Хорошо, я запомню это на будущее – Stregor

ответ

4
Result := SomeInterface as ISomeInterfaceRO; 

безопасен, но не нужно вообще, потому что ISomeInterface наследуется от ISomeInterfaceROSomeInterface и, таким образом можно присвоить значение для Result. Это означает, что вы можете просто написать

Result := SomeInterface; 

Я же поставил бы конструктор на TSomeClass, который принимает значение, так что вы можете напрямую написать:

Result := TSomeClass.Create(10); 
+0

Привет, Стефан! Спасибо за ваш комментарий. Я знаю, что мой предыдущий примерный код не фокусируется на моем REAL-вопросе :) Итак, я отредактирую его и удалю наследование. – Stregor

Смежные вопросы