سوال خیلی خوبیه ، trait ها شباهت به کلاس های abstract جاوا دارند ،یعنی قابلیت های interface جاوا را به علاوه قابلیت پیاده سازی متد ها رو دارند.
اما یک ویژگی خیلی جالبی دیگه اینکه شما می توانید در trait یک رفرنس از کلاسی که بعدا قراره باهاش mix بشه رو مشخص کنید با اینکار علاوه بر اینکه می تونیم از طریق اون رفرنس به اون متدهای اون کلاس دسترسی داشته باشیم میتونیم مشخص کنیم که این trait فقط برای بعضی از کلاس ها قابل mix هست.
trait Foo{
self => {def close:Unit}
}
در این حالت میگیم که این trait Foo تنها میشه با کلاسی Mix کردش که شامل متدی به نام close که مقدار Unit برگردونه باشه در غیر اینصورت در هنگام کامپایل ارور میده. از دو جهت مفیده این قابلیت اول اینکه در برخی موقعیت ها trait شما باید امن باشه نسبت به استفاده در هر نوع کلاسی و از طرف دیگه اگه برخی ویژگی های این trait به کلاسی که قراره mix کنتش ربط داشته باشه می توانیم با استفاده از اون رفرنس (در این مثال self) استفاده کنیم.