آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
مشکل عدم دسترسی خریداران پیشین به برخی آموزش ها برطرف شد
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

interface ها در کاتلین

134089  4 سال پیش  4 سال پیش
+1 0

سلام و خسته نباشید خدمت استاد و عزیزان
دوستان امکانش هست کسی مفهوم interface در کاتلین رو و ارتباطش با وراثت به من بگه

 برای این سوال 2 پاسخ وجود دارد.
پاسخ به سوال 
وحید گروسی  4 سال پیش
+2 0

با سلام و احترام
وقتی ما کاری را بخواهیم انجام بدهیم ولی نمی خواهیم بدانیم که چگونه انجام می شود از interface استفاده می کنیم به عنوان مثال من به شما می گویم بروید و از منزل مدرک خود را بیاورید. در اینجا برای من یک چیز مهم است آن هم مدرک پس اینکه شما چگونه مدرک را می آورید با هوپیما می روید با ... مهم نیست مهم مدرک است که بیاورید و به من بدهید.
مثال واضح تر در برنامه نویسی اندروید وقتی ما روی یک آیتم در ریسایلکرویو کلیک می کنیم انتظار داریم آبجکتی که روی آن کلیک کرده ایم به ما داده شود به صورت پیشفرض این امکان وجود ندارد ما با کمک اینترفیس میتوانیم بگوییم هر وقت روی آیتم کلیک شد مقدار متناظر در آن Position‌را به ما برگرداند.
این توضیح خلاصه ای از مفهوم اینترفیس بود.
در مثال زیر با استفاده از onTransactionClickListener میخواهیم وقتی کاربر روی دکمه حذف (delete) کلیک کرد آبجکت متناظر آن را به کاربر در جایی که فراخوانی شده است برگردانیم.

Adapter
class TransactionListAdapter(@LayoutRes var layoutItemRes: Int, var onTransactionClickListener: OnTransactionClickListener) :
ListAdapter<Transaction, TransactionListAdapter.TransactionViewHolder>(DIFF_CALLBACK) {
private var selectedItem = 0

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TransactionListAdapter.TransactionViewHolder {
val view = LayoutInflater.from(parent.context).inflate(layoutItemRes, parent, false)
return TransactionListAdapter.TransactionViewHolder(view)
}

override fun onBindViewHolder(holder: TransactionListAdapter.TransactionViewHolder, position: Int) {
holder.imgItemTransactionDelete.setOnClickListener {
onTransactionClickListener.onTransactionClicked(getItem(position))
}
}

class TransactionViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {

}


companion object {
var DIFF_CALLBACK: DiffUtil.ItemCallback<Transaction> = object : DiffUtil.ItemCallback<Transaction>() {
override fun areItemsTheSame(oldItem: Transaction, newItem: Transaction): Boolean {
return oldItem.id === newItem.id
}

override fun areContentsTheSame(oldItem: Transaction, newItem: Transaction): Boolean {
return oldItem.equals(newItem)
}
}
}
}

MainActivity
val listener = object : OnTransactionClickListener {
override fun onTransactionClicked(transaction: Transaction) {
Toast.makeText(VBase.getContext(), "" + transaction.toString(), Toast.LENGTH_LONG).show()
// با هر بار کلیک مقدار آن در MainActivity در دسترس است
}
}
transactionListAdapter = TransactionListAdapter(R.layout.item_transaction_in_category, listener)

وقتی ما کلاس پدر که از آن اصطلاحاْ extends کرده ایم دارای متد های Abstract باشد ما در کلاس فرزند می بایست آن متد ها را پیاده سازی نماییم. 
ذکر یک نکته مهم است :
مفهوم Abstraction را با Interface اشتباه نگیرید

0 0
مفهوم Abstraction رو هم بگید تا توضیحتون کامل شه و با هم اشتباه نگیریم. ممنون (4 سال پیش)
0 0
نظر پاسخ شما در قسمت زیر درج شد (4 سال پیش)
پاسخ به سوال 
وحید گروسی  4 سال پیش
+1 0

معادل فارسی آن انتزاع یا تجدید است اما همیشه در ترجمه اصلاحات تخصصی بهتر است تلفظ خود کلمه را یاد بگیریم نه ترجمعه فارسی آن.
با کمی تفاوت در تعریف Inteface می توان گفت که :
وقتی ما میدانیم چه کارهایی باید انجام شوند ولی نمی دانیم که چگونه باید  انجام می شوند.
در Abstract Class ها مشخص می کنیم که کلاس مد نظر چه عملکردی باید داشته باشد اما اینکه چگونه انجام می شوند به من ( کلاس مد نظر)  ربطی ندارد.
به عنوان مثال من در کلاس Car میگویم که کلاس باید دو متد ترمزُ و حرکت داشته باشد اما پیاده سازی آن به عهده من نیست و بر عهده فرزندانی است که من را extends  کرده اند.
Pride extends Card -Dena extends Car
  پراید و دنا هر دو حرکت می کنند و ترمز میگیرند ولی قاعدتاْ روش کار هر یک متفاوت است.

public abstract class AbstractCar {
private String name;
// به عهده ی Pride و Dena است
public abstract void driving();
public abstract void run();
// به عهده ی Pride و Dena است

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
}

نکته ای که وجود دارد این است که ما نمیتوانیم از کلاس Abstract نمونه بگیریم یعنی نمی شود کفت :

AbstractCar abstractCar = new AbstractCar();

بلکه میتوان به صورت زیر استفاده کرد:

public class Pride extends AbstractCar {
@Override
public void driving() {

}

@Override
public void run() {

}
}

 


پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .