Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

إعادة تعريف toString()

جزء من قسم Object Oriented Programming في رحلة Dart على Coddy — الدرس 70 من 110.

عندما تقوم بطباعة كائن (object) في Dart، قد ترى شيئاً مثل Instance of 'Person' - وهذا ليس مفيداً جداً. يحدث هذا لأن كل فئة (class) ترث أسلوب toString() افتراضياً من Object يعيد اسم الفئة فقط.

من خلال تجاوز toString()، يمكنك تقديم تمثيل نصي ذو معنى لكائناتك:

class Person {
  String name;
  int age;
  
  Person(this.name, this.age);
  
  @override
  String toString() {
    return 'Person(name: $name, age: $age)';
  }
}

void main() {
  var person = Person('Alice', 30);
  print(person);  // Person(name: Alice, 30)
}

بدون التجاوز، سيقوم print(person) بطباعة Instance of 'Person'. وباستخدامه، ستحصل على معلومات مفيدة حول حالة الكائن.

يتم استدعاء الطريقة toString() تلقائياً كلما احتاجت Dart إلى تحويل الكائن الخاص بك إلى سلسلة نصية - في جمل print()، أو إدراج السلاسل النصية (string interpolation)، أو عند الدمج مع سلاسل نصية أخرى:

var message = 'User: $person';  // يتم استدعاء toString() تلقائياً
print('Found: ' + person.toString());  // استدعاء صريح

إن وجود تنفيذ جيد للدالة toString() يجعل عملية تصحيح الأخطاء أسهل بكثير من خلال السماح لك بفحص قيم الكائنات بسرعة أثناء عملية التطوير.

challenge icon

التحدي

سهل

لنقم ببناء نظام كتالوج منتجات حيث يعرض كل منتج معلوماته بتنسيق نظيف وقابل للقراءة عند طباعته. ستتدرب على تجاوز (overriding) تابع toString() لجعل كائناتك أكثر سهولة في تصحيح الأخطاء (debuggable) وأكثر سهولة في الاستخدام.

ستقوم بتنظيم الكود الخاص بك في ملفين:

  • product.dart: أنشئ فئة Product تمثل عنصراً في متجر. يجب أن يحتوي منتجك على name (String)، و price (double)، و quantity (int). قم بتجاوز تابع toString() ليعيد سلسلة نصية منسقة بهذا التنسيق تماماً: Product(name: [name], price: $[price], qty: [quantity])
  • main.dart: استورد ملف المنتج الخاص بك ووضح كيف يجعل تجاوز toString() طباعة الكائنات أكثر فائدة بكثير. أنشئ ثلاثة منتجات وقم بطباعتها لترى تمثيل السلسلة النصية المخصص الخاص بك قيد التشغيل:
    • منتج باسم 'Laptop' بسعر 999.99 وكمية 5
    • منتج باسم 'Mouse' بسعر 29.5 وكمية 50
    • منتج باسم 'Keyboard' بسعر 75.0 وكمية 30
    قم أيضاً بتوضيح استيفاء السلسلة النصية (string interpolation) عن طريق طباعة رسالة تتضمن أحد منتجاتك: Featured: [product] باستخدام منتج Laptop.

لاحظ كيف أن طباعة كل منتج مباشرة تعرض معلومات مفيدة بدلاً من رسالة Instance of 'Product' غير المفيدة. يتم استدعاء تابع toString() الخاص بك تلقائياً في كل من جمل print() وعند استخدام استيفاء السلسلة النصية.

المخرجات المتوقعة:

Product(name: Laptop, price: $999.99, qty: 5)
Product(name: Mouse, price: $29.5, qty: 50)
Product(name: Keyboard, price: $75.0, qty: 30)
Featured: Product(name: Laptop, price: $999.99, qty: 5)

ورقة مرجعية

بشكل افتراضي، تظهر طباعة كائن في Dart النص Instance of 'ClassName'. قم بتجاوز التابع toString() لتوفير تمثيلات نصية ذات معنى:

class Person {
  String name;
  int age;
  
  Person(this.name, this.age);
  
  @override
  String toString() {
    return 'Person(name: $name, age: $age)';
  }
}

يتم استدعاء التابع toString() تلقائيًا في جمل print() ودمج النصوص (string interpolation):

var person = Person('Alice', 30);
print(person);  // Person(name: Alice, age: 30)
var message = 'User: $person';  // يتم استدعاء toString() تلقائيًا

جرّب بنفسك

import 'product.dart';

void main() {
  // TODO: إنشاء ثلاثة مثيلات من Product:
  // 1. Laptop - price: 999.99, quantity: 5
  // 2. Mouse - price: 29.5, quantity: 50
  // 3. Keyboard - price: 75.0, quantity: 30

  // TODO: طباعة كل منتج (سيتم استدعاء toString() تلقائياً)

  // TODO: طباعة رسالة مميزة باستخدام string interpolation
  // الصيغة: Featured: [laptop product]
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس Object Oriented Programming