← Назад к вопросам

Для чего нужен Object?

1.0 Junior🔥 131 комментариев
#Dart#ООП и паттерны

Комментарии (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, обеспечивая единую иерархию для всех типов.

Для чего нужен Object? | PrepBro