AS3 — Изменение логического (объектного) поведения

#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 свойство любого объекта, потому что, как вы говорите, это медленно и подвержено ошибкам (и их трудно исправить). Но мне просто пришла в голову мысль, и я спросил.