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

Use 'default operator' alone for ANY-field semantics. Add 'override operator ?' before it when ALL fields are required.

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 ? (any-field) + optional override ? (custom logic).

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