[Flutter] class operator override

Flutter|2021. 12. 17. 15:20

Dart는 class에서 연산자를 재정의할 수 있는 모양이다. Overriding 방법은 다른 함수를 overriding할 때와 비슷하지만, 함수명 대신 operator + 등과 같이 써주면 된다. == 연산자의 경우, argument에 covariant를 붙여준 후 hashCode도 override해줘야만 한다. 아래 예시에서 override toString()은 결과 출력을 위해 추가했다.

 

예시:

class Class {
  final String id;
  final DateTime date;
  final num number;

  const Class({
    this.id = "",
    required this.date,
    this.number = 0,
  });

  @override
  int get hashCode => date.hashCode;

  @override
  bool operator ==(covariant Class other) => date.compareTo(other.date) == 0;

  bool operator >(Class other) => date.compareTo(other.date) > 0;
  bool operator <(Class other) => date.compareTo(other.date) < 0;
  bool operator >=(Class other) => date.compareTo(other.date) >= 0;
  bool operator <=(Class other) => date.compareTo(other.date) <= 0;

  Class operator +(Class other) => Class(
        id: id,
        date: DateTime.now(),
        number: number + other.number,
      );
  Class operator -(Class other) => Class(
        id: id,
        date: DateTime.now(),
        number: number - other.number,
      );
  Class operator -() => Class(
        id: id,
        date: DateTime.now(),
        number: -number,
      );
  Class operator *(Class other) => Class(
        id: id,
        date: DateTime.now(),
        number: number * other.number,
      );
  Class operator /(Class other) => Class(
        id: id,
        date: DateTime.now(),
        number: number / other.number,
      );
  Class operator ~/(Class other) => Class(
        id: id,
        date: DateTime.now(),
        number: number ~/ other.number,
      );
  Class operator %(Class other) => Class(
        id: id,
        date: DateTime.now(),
        number: number % other.number,
      );

  @override
  String toString() {
    return number.toString();
  }
}

 

결과:

void main() {
  Class z = Class(id: "last", date: DateTime(2021, 12, 31), number: 127),
      a = Class(id: "first", date: DateTime(2022, 1, 1), number: 0),
      az = Class(id: "what", date: DateTime(2021, 12, 31), number: 0);

  print([a == a, a == z, a == az, z == az]);
  print([a > a, a > z, a > az, z > az]);
  print([a < a, a < z, a < az, z < az]);
  print([a >= a, a >= z, a >= az, z >= az]);
  print([a <= a, a <= z, a <= az, z <= az]);
  print([a + z, a - z, a * z, a / z, a ~/ z, a % z]);
  print([a += z, a]);
  print([a -= z, a]);
}
[true, false, false, true]
[false, true, true, false]
[false, false, false, false]
[true, true, true, true]
[true, false, false, true]
[127, -127, 0, 0.0, 0, 0]
[127, 127]
[0, 0]
Exited

댓글()