Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Object - корневой класс иерархии типов в Dart
Object - это суперкласс всех типов в Dart. Каждый класс, даже если не наследует явно, неявно расширяет Object.
Основное назначение
// Все эти типы наследуют Object
String text = "hello";
int number = 42;
bool flag = true;
List items = [1, 2, 3];
MyClass obj = MyClass();
// Object - суперкласс для всех
Object anything = text; // OK
anything = number; // OK
anything = flag; // OK
anything = items; // OK
anything = obj; // OK
Методы Object
Каждый класс получает методы из Object:
// toString() - строковое представление
class User {
String name;
User(this.name);
@override
String toString() => "User($name)";
}
final user = User("John");
print(user.toString()); // User(John)
// hashCode - хеш для использования в Set и Map
final set = <User>{user};
// == оператор - сравнение объектов
final user1 = User("John");
final user2 = User("John");
print(user1 == user2); // false (по ссылке)
// runtimeType - получить тип объекта
final obj = User("John");
print(obj.runtimeType); // User
Переопределение методов Object
class Person {
final String name;
final int age;
Person(this.name, this.age);
@override
String toString() => "Person(name: $name, age: $age)";
@override
bool operator ==(Object other) {
if (other is! Person) return false;
return name == other.name && age == other.age;
}
@override
int get hashCode => Object.hash(name, age);
}
final p1 = Person("John", 30);
final p2 = Person("John", 30);
print(p1 == p2); // true (по значениям)
print(p1.toString()); // Person(name: John, age: 30)
// В Set объекты считаются одинаковыми
final set = {p1, p2};
print(set.length); // 1
Object для типизации
// Функция принимает любой Object
void printInfo(Object obj) {
print("Type: ${obj.runtimeType}");
print("Value: $obj");
}
printInfo("text"); // Type: String, Value: text
printInfo(42); // Type: int, Value: 42
printInfo([1, 2, 3]); // Type: List<int>, Value: [1, 2, 3]
// Функция возвращает Object
Object getData(String type) {
switch (type) {
case "string":
return "Hello";
case "number":
return 42;
case "list":
return [1, 2, 3];
default:
return "Unknown";
}
}
final data = getData("number");
if (data is int) {
print("Number: ${data * 2}");
}
Object vs dynamic
// Object - с типобезопасностью
Object value = "text";
print(value.toString()); // OK, есть у Object
// print(value.length); // Ошибка! String методы недоступны
// Нужно привести тип
if (value is String) {
print(value.length); // OK, теперь доступно
}
// dynamic - без типобезопасности
dynamic dyn = "text";
print(dyn.length); // OK, но может упасть в runtime
dyn.nonexistent(); // Компилируется, но упадёт в runtime
Практические примеры
Сравнение объектов:
class Todo {
final int id;
final String title;
Todo(this.id, this.title);
@override
bool operator ==(Object other) {
return other is Todo && id == other.id;
}
@override
int get hashCode => id.hashCode;
}
final t1 = Todo(1, "Task");
final t2 = Todo(1, "Other");
print(t1 == t2); // true (по id)
print({t1, t2}.length); // 1 (в Set считаются одним)
Коллекции с Object:
final mixed = <Object>[
"text",
42,
3.14,
true,
User("John"),
];
for (final item in mixed) {
if (item is String) print("String: $item");
if (item is int) print("Int: $item");
if (item is double) print("Double: $item");
if (item is bool) print("Bool: $item");
if (item is User) print("User: ${item.name}");
}
Best Practice
- Переопределяй toString() для отладки
- Переопределяй == и hashCode вместе если нужна равность по значениям
- Используй Object для типов коллекций (List<Object>, Set<Object>)
- Используй type guards (is, is!) вместо Object для safety
- Избегай dynamic, используй Object
Object - фундамент типовой системы Dart, обеспечивая единую иерархию для всех типов.