#actionscript-3 #object #casting #boolean
#actionscript-3 #объект #Кастинг #логическое
Вопрос:
При приведении любого объекта к логическому значению вы получаете, true
если объект не является таковым null
и false
в противном случае, я хотел бы изменить это поведение для некоторых объектов. Я хочу, чтобы некоторые объекты возвращались false
, даже если они не являются null
Я знаю, что в ActionScript 3.0 мы можем изменить некоторые поведения объекта по умолчанию с помощью Proxy
. Можем ли мы сделать то же самое для Boolean(object)
или object as Boolean
? И как это можно сделать?
Я хочу спросить об этом после следующей мысли:
У меня есть этот код:
if (someObject)
someObject.DoSomething();
Это означает, что это DoSomething
вызывается только в том случае, someObject
если это не null
так, но это только потому, что за этим стоит «реальный» код:
if (Boolean(someObject) == true)
someObject.DoSomething();
И работает, потому что любой объект автоматически преобразуется в логическое значение, и результатом является true
, но если ссылка указывает на null
, то результат является false
.
Я хочу знать, могу ли я изменить ЭТО поведение без добавления новой функции, подобной isTrue(someObject)
или чему-то подобному.
Заранее спасибо и извините за мой плохой английский.
Ответ №1:
Нет, CustomClass(объект) и as
являются операторами приведения, поведение обоих определяется языком. И Boolean (объект) — это, afaik, глобальная функция с поведением, определяемым языком (и нет перегрузки функции.) В ActionScript 3.0 нет оператора уровня класса для приведения типов, вы должны реализовать некоторое свойство для проверки истинности / ложности.
Комментарии:
1. Если вам нужно выполнить этот тип проверки для нескольких типов объектов вашего собственного создания, вы могли бы создать интерфейс, который заставляет их реализовывать asBoolean():Boolean и приводить ссылки к типу интерфейса, в котором вы выполняете проверку.
Ответ №2:
Предупреждение: Прокси и прототип работают очень медленно. И они делают ваше приложение менее простым в обслуживании, поскольку любому дополнительному программисту потребуется учитывать необычное поведение классов ядра в вашем приложении. Это может привести к труднодоступным ошибкам. Итак, помимо предупреждений, я не думаю, что прокси-это то, что вам нужно. Я думаю, что вам нужен прототип. http://tobyho.com/Modifying_Core_Types_in_ActionScript_3_Using_the_Prototype_Object
Но если серьезно, вы должны просто создать функцию, которая проверяет классы, которые вы хотите оценить как false, вместо использования логического вычислителя. Создайте функцию, которая возвращает логическое значение.
function isFalse(object:*):Boolean {
if(object == false){
return false;
} else if (object is SpecialcaseClass){
// perform special case test here. Return the value;
return resultOfSpecialCaseTest;
}
return false;
}
Комментарии:
1. Спасибо за предупреждения, я советую не использовать прокси или изменять
prototype
свойство любого объекта, потому что, как вы говорите, это медленно и подвержено ошибкам (и их трудно исправить). Но мне просто пришла в голову мысль, и я спросил.