تیکه پاره های جاوا
💎 اینترفیس یا واسط چیست و چرا استفاده میکنیم؟ 🔆 اینترفیس یا واسط در واقع یک نوع قرار داد میان کلاس ها خواهد بود. به این صورت که هر کلاسی که اینترفیس موردنظر را پیاده سازی کند، موظف است تمامی متد های آن را هم پیاده سازی کند. ☕️ @PIECEJAVA
🔰 برای مثال فرض کنید قرار است انواع گوشی های هوشمند از کلاس موبایل ارث بری کنند که ویژگی های اولیه یک گوشی را پیاده سازی میکنند. مثلا لازم است که تمامی گوشی ها بخش گالری، دوربین و مرورگر و... داشته باشند. حالا هر کلاسی از مجموعه گوشی های هوشمند که واسط موبایل را پیاده سازی کند، موظف است متد های مربوط به موبایل را هم پیدا سازی کند. در نتیجه به کمک اینترفیس میتوان این اطمینان را حاصل کرد که تمامی کلاس های گوشی این ویژگی ها را پیاده سازی میکنند:
💡 از آنجا که متد های ابسترکت باید پیاده سازی شوند، در نتیجه لزومی به نوشتن سطح دسترسی متد ابسترکت نیست.
برای پیاده سازی اینترفیس بعد از اسم کلاس از کلیدواژه implements و سپس اسم اینترفیس مورد نظر استفاده میشود. برای مثال:
💬البته از بعد جاوای 8 متد های دیفالت و استاتیک هم به اینترفیس ها اضافه شده که انشالله در فرصتی دیگر حتما بررسی میشه :)
#interface
———
☕️ @PIECEJAVA
public interface Mobile {
void browser();
void camera();
void gallery();
}
💡 به متد هایی که فقط تعریف شوند و بدنه ای نداشته باشند (پیاده سازی نشده باشند) آبسترکت گفته میشود. یعنی فقط امضای متد method signature نوشته میشود. منظور از امضای متد، ساختار اولیه متد میباشد که نشان دهنده سطح دسترسی، نوع خروجی، اسم متد و ورودی های متد است. برای مثال:void browser();💡 اینترفیس حاوی متد های ابسترکت میباشد.
💡 از آنجا که متد های ابسترکت باید پیاده سازی شوند، در نتیجه لزومی به نوشتن سطح دسترسی متد ابسترکت نیست.
برای پیاده سازی اینترفیس بعد از اسم کلاس از کلیدواژه implements و سپس اسم اینترفیس مورد نظر استفاده میشود. برای مثال:
public class Note8Pro implements Mobile{
@Override
public void browser() { }
@Override
public void camera() { }
@Override
public void gallery() { }
}
حالا برای هر کلاس متد های browser , camera و gallery را پیاده سازی میکنیم. دقت داشته باشید که حذف هر کدام از متد های بالا، خطای کمپایلر را خواهد داشت. زیرا همانطور که گفتیم، کلاس ها موظفند این متد ها را پیاده سازی کنند.💬البته از بعد جاوای 8 متد های دیفالت و استاتیک هم به اینترفیس ها اضافه شده که انشالله در فرصتی دیگر حتما بررسی میشه :)
#interface
———
☕️ @PIECEJAVA
👍11
💠 نمونه ای از کاربرد های اینترفیس
🕘 زمان مطالعه: 2:00
🔆 در این مثال میخواهیم به کمک اینترفیس به بخشی از داده های یک کلاس داخلی دسترسی پیدا کنیم.
🔅 فرض کنید کلاس داخلی به نام Node را تعریف کرده اید:
💬لیست پیوندی (LinkedList) ساختمان داده ایست که در آن داده ها در قالب یک Node ذخیره و از طریق آدرس گره بعدی خود به همدیگر لینک میشوند. در واقع هر Node حامل داده و آدرس گره بعدی خودش است.
در مثال بالا هیچ لزومی ندارد که کاربر به محتویات کلاس Node دسترسی پیدا کند. برای همین کلاس Node را پرایوت میکنیم.
اما از طرفی فرض کنید که میخواهیم به کاربر اجازه ی دسترسی به خود داده ی ذخیره شده را صادر کنیم. (یعنی فقط به داده و نه چیز دیگری از این کلاس).
در این حالت از اینترفیس استفاده میکنیم. مثلا اینترفیس زیر را ایجاد میکنیم:
حالا برای کلاس داخلی Node اینترفیس Position را پیاده سازی میکنیم و از طریق متد getElement اجازه ی دسترسی به داده را صادر میکنیم:
در متد getFirst خروجی متد را از جنس Position<E> قرار داده ایم. این در واقع باعث میشود که کاربر به Node در قالب یک Position<E> دسترسی داشته باشد و همین باعث محدود شدن دسترسی اش به متد های اینترفیس Position خواهد شد. بنابراین از آنجا که Position فقط یک متد getElement را دارد، کاربر بجز به متد getElement، به هیچ داده ی دیگری از کلاس Node دسترسی نخواهد داشت.
👈 نکته ی 1: البته فکر میکنم شما به این موضوع واقف باشید که چه لزومی به پیاده سازی Position<E> داریم وقتی که میتوانیم بگوییم:
در حقیقت هدف محدود سازی دسترسی به کلاس داخلی بود و هر کجا که نیاز باشد به بخشی از کلاس داخلی اجازه ی دسترسی صادر کنید، میتوانید از اینترفیس استفاده کنید.
مثلا سناریویی را در نظر بگیرید که یک کلاس داخلی چندین نوع داده را نگهداری میکند. حالا میتوان با پیاده سازی اینترفیس ها در کلاس داخلی مشخص کرد که از طریق کلاس خارجی، به چه بخشی از داده های کلاس میتوان دسترسی پیدا کرد.
👈 نکته ی 2: مثال بالا از کتاب ساختمان داده ی Michael. T goodrich هستش. میتوانید از همین کتاب، صفحه ی 271، فصل 7، مبحث Positional Lists، این مثال رو بیشتر و دقیق تر بررسی کنید. در واقع از Position<E> برای پیاده سازی یک حالت خاص از پیمایش داده های لینکدلیست به کار گرفته میشود
#interface
———
@PieceJava
🕘 زمان مطالعه: 2:00
🔆 در این مثال میخواهیم به کمک اینترفیس به بخشی از داده های یک کلاس داخلی دسترسی پیدا کنیم.
🔅 فرض کنید کلاس داخلی به نام Node را تعریف کرده اید:
public class LinkedList<E>{
private class Node<E>{
...
}
...
}💬لیست پیوندی (LinkedList) ساختمان داده ایست که در آن داده ها در قالب یک Node ذخیره و از طریق آدرس گره بعدی خود به همدیگر لینک میشوند. در واقع هر Node حامل داده و آدرس گره بعدی خودش است.
در مثال بالا هیچ لزومی ندارد که کاربر به محتویات کلاس Node دسترسی پیدا کند. برای همین کلاس Node را پرایوت میکنیم.
اما از طرفی فرض کنید که میخواهیم به کاربر اجازه ی دسترسی به خود داده ی ذخیره شده را صادر کنیم. (یعنی فقط به داده و نه چیز دیگری از این کلاس).
در این حالت از اینترفیس استفاده میکنیم. مثلا اینترفیس زیر را ایجاد میکنیم:
public interface Position<E>{
E getElement();
}حالا برای کلاس داخلی Node اینترفیس Position را پیاده سازی میکنیم و از طریق متد getElement اجازه ی دسترسی به داده را صادر میکنیم:
public class LinkedList<E>{
private class Node<E> implements Position<E>{
E data;
Node next;
...
...
@Override
public E getElement(){
return data;
}
...
...
}
private Node<E> head;
private Node<E> tail;
...
...
public Position<E> getFirst(){
return head;
}
...
}در متد getFirst خروجی متد را از جنس Position<E> قرار داده ایم. این در واقع باعث میشود که کاربر به Node در قالب یک Position<E> دسترسی داشته باشد و همین باعث محدود شدن دسترسی اش به متد های اینترفیس Position خواهد شد. بنابراین از آنجا که Position فقط یک متد getElement را دارد، کاربر بجز به متد getElement، به هیچ داده ی دیگری از کلاس Node دسترسی نخواهد داشت.
👈 نکته ی 1: البته فکر میکنم شما به این موضوع واقف باشید که چه لزومی به پیاده سازی Position<E> داریم وقتی که میتوانیم بگوییم:
public E getFirst(){
return head.data;
}در حقیقت هدف محدود سازی دسترسی به کلاس داخلی بود و هر کجا که نیاز باشد به بخشی از کلاس داخلی اجازه ی دسترسی صادر کنید، میتوانید از اینترفیس استفاده کنید.
مثلا سناریویی را در نظر بگیرید که یک کلاس داخلی چندین نوع داده را نگهداری میکند. حالا میتوان با پیاده سازی اینترفیس ها در کلاس داخلی مشخص کرد که از طریق کلاس خارجی، به چه بخشی از داده های کلاس میتوان دسترسی پیدا کرد.
👈 نکته ی 2: مثال بالا از کتاب ساختمان داده ی Michael. T goodrich هستش. میتوانید از همین کتاب، صفحه ی 271، فصل 7، مبحث Positional Lists، این مثال رو بیشتر و دقیق تر بررسی کنید. در واقع از Position<E> برای پیاده سازی یک حالت خاص از پیمایش داده های لینکدلیست به کار گرفته میشود
#interface
———
@PieceJava
👍11
در جاوا اینترفیس یک داده ی مرجع هستش و در شی گرایی به نحوی نقش یک قرارداد رو بازی میکنه. یعنی وقتی کلاسی اینترفیسی رو پیاده سازی یا implement میکنه، موظفه که تمامی متد های تعریف شده در اینترفیس رو حتما پیاده کنه.
1. تمام متد ها بطور پیش فرض abstract هستند.
2. تمام فیلد ها بطور پیش فرض public static final هستند.
3. اینترفیس میتواند دارای توابع default و static باشد(این ویژگی از جاوا 8 به بعد اضافه شده).
بصورت سینتکسی و ساده، بصورت زیر تعریف میشه:
public interface Printable{
int VALUE = 10;
void print(String msg);
default void defaultMethod(...) {....}
static void staticMethod(...) {....}
}اما جالبه بدونید که سینتکس کاملش بصورت زیره:
public abstract interface Printable{
public static final int VALUE = 10;
public abstract void print(String msg);
public default void defaultMethod(...) {....}
public static void staticMethod(...) {....}
}———
#interface
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4🔥1