پخته‌ترین و کاربردی‌ترین محصولات آموزشی سون‌لرن را با آفرهای ویژه تهیه کنید🔥
۰ ثانیه
۰ دقیقه
۰ ساعت
۸ Nik
علت اجرای متد toString بدون فراخوانی آن در متد main یا کلاس Student
جامعه فلاتر ایجاد شده در ۲۵ بهمن ۱۴۰۱

وقتی toString رو توی بدنه یک کلاس می‌نویسیم همه اعضای اون کلاس رو به استرینگ تبدیل می‌کنه؟ اینو در یکی از پاسخ‌ها دیدم. استاد محترم طراحتا به این موضوع اشاره نکردند. علت این موضوع چیست؟

و سوال دوم اینکه اگر بخواهیم فقط نام پرینت شود و نه مثلا آی‌دی و نام خانوادگی چه باید کرد؟ اینجا کل فیلدها را به صورت استرینگ نمایش می‌دهد.

متد toString متدی هست که شما بسته به نیازتون هر طور که بخواهید میتونید پیاده سازیش کنید. ممکنه همه ی فیلد‌ها باشه ممکنه هیچکدوم و شاید بعضی از اون ها. این متد در کلاس object تعریف میشه و در صورت نیاز می‌تونید اون رو override کنید.

در اندروید استودیو با دکمه‌های alt+insert میتونید toString رو پیدا کنید و هر فیلدی که مدنظرتون هست انتخاب کنید. در مورد پیاده سازی دستی هم همین طوره.

یلدا محصلی ۲۵ بهمن ۱۴۰۱، ۱۹:۵۸

مشخصا در مثال این درس منظورم بود. در اینجا بدون فراخوانی و فقط با override متد در کلاس، کل فیلدها به استرینگ مد نظر تبدیل شدند. اگر مثال رو مشاهده کنید هیچ کجا این متد فراخوانده نشده.

Nik ۲۶ بهمن ۱۴۰۱، ۰۸:۱۷

آیا با override کردن یک متد در کلاس، بدون فراخوانی، اون متد خودش رو اجرا می‌کنه؟ اینجا انگار اینجوری بوده‌.

Nik ۲۶ بهمن ۱۴۰۱، ۰۸:۱۸

هیچ تابعی بدون فراخوانی اجرا نخواهد شد. در اون قسمتی از کد که نوشته شد:

print(students['چ']);

به طور ضمنی تابع toString فراخوانی شده است؛ چون تابع print در ورودی object دریافت میکنه. گاهی اوقات هم ممکنه ارور بگیرید که این این مقدار پاس داده شده به فلان تابع string نیست (به دلیل اینکه اون تابع فقط string دریافت میکنه)، در اون حالت باید صراحتا toString رو صدا بزنید.


یلدا محصلی ۲۶ بهمن ۱۴۰۱، ۰۹:۵۳

خیلی ممنون از توضیح‌تون. هنوز برای من جا نیفتاده‌ ممکن هست بیشتر توضیح بدید؟

این موضوع رو اصلا اشاره‌ای بهش نکردند در درس و سوال یکی دیگه از افراد هم بود که منتوری آنجا پاسخ دیگری دادند.

Nik ۲۶ بهمن ۱۴۰۱، ۱۱:۲۵

خواهش میکنم. هر توضیحی بخواید درخدمتم منتها اگر دقیق‌تر بگید کجا ابهام هست بهتر میتونم کمک کنم. نحوه فراخوانی مبهمه؟ کد پایین و کد قبلی دقیقا یک جواب رو بر می‌گردونند. تابع print چون تایپ پارامتر ورودی obeject هست و لزوما string نیست خودش این کار رو انجام میده.

print(students['چ'].toString());

تابع toString به دلیل اینکه built in هست یک حالات خاصی هم داره. مثلا ممکنه شما یک رشته به این صورت تعریف کنید:

String studentInfo = "Student Information is: ${students['چ'}";

اینجا عملگر $ خودش در نظر میگیره که در صورتی که متغیر مقابلش رشته نبود، toString صدا زده بشه. بدنه تابع print رو هم بررسی کنید تفریبا همین طور هست.

مقداری پیچیده شد اما امیدوارم جا افتاده باشه.

بهترین پاسخ
یلدا محصلی ۲۶ بهمن ۱۴۰۱، ۱۲:۰۷

فکر می‌کنم تقریبا متوجه شدم‌. یکبار دیگه مرور خواهم کرد تا ببینم دقیقا چه شد. ممنون از شما.

Nik ۲۶ بهمن ۱۴۰۱، ۱۲:۰۹

اگر پاسخ صحیح رو دریافت کردید تیک سبز رو به پاسخ صحیح بدید تا سؤال شما ار حالت پیگیری خارج شود.

محسن موحد ۳۰ بهمن ۱۴۰۱، ۱۷:۲۲