Define a PaymentRequest that is only 'set' when all three fields are present.

← Operators and Expressions · Ref: Q1090

Custom ? goes before default operator — require all fields:

  override operator ? as pure
    <- rtn as Boolean: amount? and currency? and recipient?
  default operator

'default operator' alone already requires ALL fields. Add 'override operator ?' before it when you need different logic - for example treating a partially-filled object as set.

See Q1069 for mixing default with overrides. See Q1087 for default ?.

Example

defines module qa.operators.defaultvsoverrideisset

  defines class

    //ALL required fields needed for a valid payment
    PaymentRequest
      amount <- Float()
      currency <- String()
      recipient <- String()

      PaymentRequest()
        ->
          amount as Float
          currency as String
          recipient as String
        this.amount :=: amount
        this.currency :=: currency
        this.recipient :=: recipient

      PaymentRequest()
        -> amount as Float
        this.amount :=: amount

      //Custom ?: ALL fields required — BEFORE default operator
      override operator ? as pure
        <- rtn as Boolean: amount? and currency? and recipient?

      default operator

  defines program

    DefaultVsOverrideIsSetDemo()
      stdout <- Stdout()

      //ALL fields set — override ? returns true
      validPayment <- PaymentRequest(99.99, "GBP", "Alice")
      stdout.println(`Valid payment set?: ${validPayment?}`)

      //Only amount set — override ? returns false
      partialPayment <- PaymentRequest(50.00)
      stdout.println(`Partial payment set?: ${partialPayment?}`)

Common mistakes

E01086 — default operator must be the LAST item in the class body. Put override operator ? BEFORE default operator.

Incorrect:

      default operator

      override operator ? as pure
        <- rtn as Boolean: x? and y?

Correct:

      override operator ? as pure
        <- rtn as Boolean: amount? and currency? and recipient?

      default operator
Other ways to ask this
  • I need my payment object to reject partial data — override operator ? to require all fields
  • In Java I'd write an isValid() method. Write the EK9 equivalent using override operator ?
  • Given a class with amount, currency, and recipient, make ? return false unless all are set
  • Create a class where default operator generates most operators but ? has custom all-field logic

Coming from another language?

Java: no equivalent — isValid() is manual. Python: __bool__ is one semantics. EK9: default ? (all-field) + optional override ? (custom logic).

Keywords: any-field, isSet, choose, default, ?, all-field, semantics, override