| // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| |
| part of dart.core; |
| |
| /// The base class for all Dart objects exception `null`. |
| /// |
| /// Because `Object` is a root of the non-nullable Dart class hierarchy, |
| /// every other non-`Null` Dart class is a subclass of `Object`. |
| /// |
| /// When you define a class, you should consider overriding [toString] |
| /// to return a string describing an instance of that class. |
| /// You might also need to define [hashCode] and [operator ==], as described in the |
| /// [Implementing map keys](https://dart.dev/guides/libraries/library-tour#implementing-map-keys) |
| /// section of the [library tour](https://dart.dev/guides/libraries/library-tour). |
| @pragma("vm:entry-point") |
| class Object { |
| /// Creates a new [Object] instance. |
| /// |
| /// [Object] instances have no meaningful state, and are only useful |
| /// through their identity. An [Object] instance is equal to itself |
| /// only. |
| @pragma("vm:recognized", "other") |
| const Object(); |
| |
| /// The equality operator. |
| /// |
| /// The default behavior for all [Object]s is to return true if and |
| /// only if this object and [other] are the same object. |
| /// |
| /// Override this method to specify a different equality relation on |
| /// a class. The overriding method must still be an equivalence relation. |
| /// That is, it must be: |
| /// |
| /// * Total: It must return a boolean for all arguments. It should never throw. |
| /// |
| /// * Reflexive: For all objects `o`, `o == o` must be true. |
| /// |
| /// * Symmetric: For all objects `o1` and `o2`, `o1 == o2` and `o2 == o1` must |
| /// either both be true, or both be false. |
| /// |
| /// * Transitive: For all objects `o1`, `o2`, and `o3`, if `o1 == o2` and |
| /// `o2 == o3` are true, then `o1 == o3` must be true. |
| /// |
| /// The method should also be consistent over time, |
| /// so whether two objects are equal should only change |
| /// if at least one of the objects was modified. |
| /// |
| /// If a subclass overrides the equality operator, it should override |
| /// the [hashCode] method as well to maintain consistency. |
| external bool operator ==(Object other); |
| |
| /// The hash code for this object. |
| /// |
| /// A hash code is a single integer which represents the state of the object |
| /// that affects [operator ==] comparisons. |
| /// |
| /// All objects have hash codes. |
| /// The default hash code implemented by [Object] |
| /// represents only the identity of the object, |
| /// the same way as the default [operator ==] implementation only considers objects |
| /// equal if they are identical (see [identityHashCode]). |
| /// |
| /// If [operator ==] is overridden to use the object state instead, |
| /// the hash code must also be changed to represent that state, |
| /// otherwise the object cannot be used in hash based data structures |
| /// like the default [Set] and [Map] implementations. |
| /// |
| /// Hash codes must be the same for objects that are equal to each other |
| /// according to [operator ==]. |
| /// The hash code of an object should only change if the object changes |
| /// in a way that affects equality. |
| /// There are no further requirements for the hash codes. |
| /// They need not be consistent between executions of the same program |
| /// and there are no distribution guarantees. |
| /// |
| /// Objects that are not equal are allowed to have the same hash code. |
| /// It is even technically allowed that all instances have the same hash code, |
| /// but if clashes happen too often, |
| /// it may reduce the efficiency of hash-based data structures |
| /// like [HashSet] or [HashMap]. |
| /// |
| /// If a subclass overrides [hashCode], it should override the |
| /// [operator ==] operator as well to maintain consistency. |
| external int get hashCode; |
| |
| /// A string representation of this object. |
| /// |
| /// Some classes have a default textual representation, |
| /// often paired with a static `parse` function (like [int.parse]). |
| /// These classes will provide the textual representation as |
| /// their string represetion. |
| /// |
| /// Other classes have no meaningful textual representation |
| /// that a program will care about. |
| /// Such classes will typically override `toString` to provide |
| /// useful information when inspecting the object, |
| /// mainly for debugging or logging. |
| external String toString(); |
| |
| /// Invoked when a non-existent method or property is accessed. |
| /// |
| /// A dynamic member invocation can attempt to call a member which |
| /// doesn't exist on the receiving object. Example: |
| /// ```dart |
| /// dynamic object = 1; |
| /// object.add(42); // Statically allowed, run-time error |
| /// ``` |
| /// This invalid code will invoke the `noSuchMethod` memthod |
| /// of the integer `1` with an [Invocation] representing the |
| /// `.add(42)` call and arguments (which then throws). |
| /// |
| /// Classes can override [noSuchMethod] to provide custom behavior |
| /// for such invalid dynamic invocations. |
| /// |
| /// A class with a non-default [noSuchMethod] invocation can also |
| /// omit implementations for members of its interface. |
| /// Example: |
| /// ```dart |
| /// class MockList<T> implements List<T> { |
| /// noSuchMethod(Invocation invocation) { |
| /// log(invocation); |
| /// super.noSuchMethod(invocation); // Will throw. |
| /// } |
| /// } |
| /// void main() { |
| /// MockList().add(42); |
| /// } |
| /// ``` |
| /// This code has no compile-time warnings or errors even though |
| /// the `MockList` class has no concrete implementation of |
| /// any of the `List` interface methods. |
| /// Calls to `List` methods are forwarded to `noSuchMethod`, |
| /// so this code will `log` an invocation similar to |
| /// `Invocation.method(#add, [42])` and then throw. |
| /// |
| /// If a value is returned from `noSuchMethod`, |
| /// it becomes the result of the original invocation. |
| /// If the value is not of a type that can be returned by the original |
| /// invocation, a type error occurs at the invocation. |
| /// |
| /// The default behavior is to throw a [NoSuchMethodError]. |
| @pragma("vm:entry-point") |
| external dynamic noSuchMethod(Invocation invocation); |
| |
| /// A representation of the runtime type of the object. |
| external Type get runtimeType; |
| } |