درس ۱۷ از ۲۵ · داده‌ها و گونه‌ها

روال‌های عام و میانجی‌ها

روال‌های عام برای هر گونه‌ای کار می‌کنند و میانجی‌ها رفتار مشترک گونه‌های مختلف را تعریف می‌کنند.

روال و ساختار عام

با <ت> پس از نام، روال یا ساختار برای هر گونه‌ی ت نوشته می‌شود. سلام برای هر گونه‌ای که به کار ببرید نسخه‌ی جداگانه و سریعی می‌سازد.

generics.salam
ساختار جعبه<ت>:
    همگانی درون: ت
پایان

روال بیشینه<ت>(الف: ت، ب: ت): ت:
    اگر الف > ب:
        برگشت الف
    پایان
    برگشت ب
پایان

روال ریشه:
    سرچاپ بیشینه(۳، ۹)، بیشینه("الف"، "ب")، بیشینه(۲.۵، ۱.۵)
    ج := جعبه { درون = "هدیه" } برگردان جعبه<رشته>
    سرچاپ ج.درون
پایان
خروجی9 ب 2.5 هدیه

میانجی

میانجی فهرستی از روش‌هاست. هر ساختاری که همه‌ی آن روش‌ها را داشته باشد، خودبه‌خود آن میانجی را پیاده کرده است. با dyn شکل هر مقداری که میانجی شکل را دارد پذیرفته می‌شود.

interface.salam
میانجی شکل:
    روال مساحت(): صحیح
    روال نام(): رشته
پایان

ساختار مربع:
    ضلع: صحیح = ۰
    همگانی روال مساحت(): صحیح: برگشت این.ضلع * این.ضلع پایان
    همگانی روال نام(): رشته: برگشت "مربع" پایان
پایان

ساختار مستطیل:
    پهنا: صحیح = ۰
    بلندی: صحیح = ۰
    همگانی روال مساحت(): صحیح: برگشت این.پهنا * این.بلندی پایان
    همگانی روال نام(): رشته: برگشت "مستطیل" پایان
پایان

روال توصیف(ش: dyn شکل):
    سرچاپ ش.نام()، ش.مساحت()
پایان

روال ریشه:
    توصیف(مربع { ضلع = ۵ })
    توصیف(مستطیل { پهنا = ۴، بلندی = ۶ })
پایان
خروجیمربع 25 مستطیل 24

روش میانجی می‌تواند بدنه‌ی پیش‌فرض داشته باشد. ساختاری که آن روش را ننویسد، نسخه‌ی پیش‌فرض را می‌گیرد و ساختاری که بنویسد، نسخه‌ی خودش را:

interface-default.salam
میانجی شکل:
    روال مساحت(): اعشار۶۴
    روال شرح(): رشته:
        برگشت "مساحت " + این.مساحت()
    پایان
پایان

ساختار دایره:
    همگانی شعاع: اعشار۶۴ = ۱.۰
    همگانی روال مساحت(): اعشار۶۴:
        برگشت ۳.۱۴ * این.شعاع * این.شعاع
    پایان
پایان

ساختار مربع:
    همگانی ضلع: اعشار۶۴ = ۱.۰
    همگانی روال مساحت(): اعشار۶۴:
        برگشت این.ضلع * این.ضلع
    پایان
    همگانی روال شرح(): رشته:
        برگشت "مربعی با ضلع " + این.ضلع
    پایان
پایان

روال ریشه:
    سرچاپ دایره { شعاع = ۲.۰ }.شرح()
    سرچاپ مربع { ضلع = ۳.۰ }.شرح()
پایان
خروجیمساحت 12.56 مربعی با ضلع 3

کاربست و محدودیت گونه

کاربست میانجی بر گونه روش‌های یک میانجی را به هر گونه‌ای، حتی صحیح و رشته، اضافه می‌کند. <ت: رتبه‌دار> یعنی روال فقط گونه‌هایی را می‌پذیرد که آن میانجی را دارند.

impl.salam
میانجی رتبه‌دار:
    روال رتبه(): صحیح
پایان

کاربست رتبه‌دار بر صحیح:
    روال رتبه(): صحیح: برگشت این پایان
پایان

کاربست رتبه‌دار بر رشته:
    روال رتبه(): صحیح: برگشت len(این) پایان
پایان

روال بالاتر<ت: رتبه‌دار>(الف: ت، ب: ت): صحیح:
    اگر الف.رتبه() > ب.رتبه():
        برگشت الف.رتبه()
    پایان
    برگشت ب.رتبه()
پایان

روال ریشه:
    سرچاپ بالاتر(۳، ۹)
    سرچاپ بالاتر("hi"، "salam")
پایان
خروجی9 5