2011-01-10 3 views
0

У меня есть эти интерфейсы:Использовать «есть» или «как» в этом случае?

public interface IBaseInterface 
{ 
    function Method():void: 
} 

public interface IExtendedInterface extends IBaseInterface 
{ 
    function MethodTwo():void; 
} 

... и вектор типа «IBaseInterface» Мне нужно перебирать:

var myVector:Vector.<IBaseInterface> = new Vector.<IBaseInterface>(); 

Мне нужно выполнить операцию на объектах, использующих IExtendedInterface. Какой предпочтительный вариант?

for each(var obj:IBaseInterface in myVector) 
{ 
    // Option 1: 
    var tmp:IExtendedInterface = obj as IExtendedInterface; 

    if(tmp != null) 
     tmp.MethodTwo(); 

    // Option 2: 
    if(obj is IExtendedInterface) 
     IExtendedInterface(obj).MethodTwo(); 
} 

Я уверен, что информация, я смотрю на это там, это просто трудно найти «есть» и «как» ... Спасибо заранее!

ответ

1

Я попробовал небольшой тест, чтобы узнать, что происходит быстрее, ожидая, что вариант «как» будет немного лучше, потому что назначение переменной и проверка на нуль кажутся менее сложными, чем сравнение типов (оба варианта включают в себя листинг типов) - и было доказано правильно.

Разница минимальна: хотя на 100000 итераций каждый вариант 1 был последовательно примерно на 3 миллисекунды (!) Быстрее.

+0

Спасибо за тестирование! – Ocelot20

1

Как weltraumpirat говорит, Вариант 1 быстрее,

Но если вы работаете на свой собственный код, и никто не собирается когда-нибудь прикоснуться к ней затем пойти на это.

Но если это совместное командование, и вы не будете запускать операцию 100 000 раз с критически важной для миллисекундных таймингов, то вариант 2 намного проще для того, чтобы кто-то просматривал ваш код для чтения.

Особенно важно, если вы передаете свой код клиенту для дальнейшей разработки.

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