ماڈیول اسباق (1/2)
انٹرفیس
جب کہ خلاصہ کلاسز جزوی طور پر نافذ کردہ کوڈ اور مثال کے شعبوں پر مشتمل ہو سکتی ہیں، جاوا میں انٹرفیس خالص رویے کے معاہدے ہیں۔ ایک انٹرفیس اس بات کی وضاحت کرتا ہے کہ کیا ایک کلاس کو کرنے کے قابل ہونا چاہیے، لیکن یہ نہیں کہ یہ کیسے_ کرتا ہے۔
یہ آپریشنز کی تعریف اور ان کے حقیقی نفاذ کے درمیان مکمل ڈیکپلنگ کی اجازت دیتا ہے۔
انٹرفیس کی وضاحت کرنا (interface)
ہم interface کلیدی لفظ استعمال کرتے ہیں۔ انٹرفیس میں اعلان کردہ تمام طریقے واضح طور پر public اور abstract ہیں (اس کی وضاحت کرنے کی ضرورت نہیں):
interface Drivable {
void startEngine();
void stopEngine();
}ایک انٹرفیس کو لاگو کرنا (implements)
ایک کلاس implements کلیدی لفظ کا استعمال کرتے ہوئے ایک انٹرفیس کو لاگو کرتی ہے اور اسے تمام متعین طریقوں کے لیے نفاذ (باڈی کے ساتھ) فراہم کرنے کی ضرورت ہوتی ہے:
class Motorcycle implements Drivable {
@Override
public void startEngine() {
System.out.println("Rombo del motore acceso!");
}
@Override
public void stopEngine() {
System.out.println("Motore spento.");
}
}انٹرفیس کے فوائد
- متعدد وراثت: جاوا میں، ایک کلاس صرف ایک پیرنٹ کلاس (سنگل وراثت) کو بڑھا سکتی ہے، لیکن یہ ایک ہی وقت میں متعدد انٹرفیس کو نافذ کر سکتی ہے۔
Java
class HybridCar implements Drivable, Chargeable { ... } - ڈیکپلنگ: آپ انٹرفیس کی قسم کا استعمال کرتے ہوئے متغیرات کی وضاحت کر سکتے ہیں۔ کوئی بھی شے جو اس انٹرفیس کو نافذ کرتی ہے اس طرح کے متغیر کو تفویض کیا جاسکتا ہے۔
Java
Drivable vehicle = new Motorcycle(); vehicle.startEngine();
انٹرفیس میں مستقل
انٹرفیس میں، فیلڈز کا اعلان کرنا ممکن ہے۔ یہ فیلڈز واضح طور پر public static final (جس کا مطلب کلاس کنسٹنٹ) ہیں، چاہے آپ ان ترمیم کاروں کی وضاحت نہ کریں۔ نتیجتاً، اعلان کے فوراً بعد انہیں شروع کیا جانا چاہیے:
interface PhysicsConstants {
double GRAVITY = 9.81; // Implicitly public static final
}پہلے سے طے شدہ طریقے (default)
Java 8 سے شروع کرتے ہوئے، default کلیدی لفظ کا استعمال کرتے ہوئے ایک انٹرفیس کے اندر پہلے سے طے شدہ نفاذ کے ساتھ طریقوں کی وضاحت ممکن ہے۔ یہ طریقے لاگو کرنے والی کلاسوں کو ان کو اوور رائڈ کرنے پر مجبور نہیں کرتے، فال بیک رویہ فراہم کرتے ہیں:
interface Logger {
void log(String message);
// Default method with a body
default void logError(String message) {
log("ERROR: " + message);
}
}خود ہی آزمائیں۔
void fly() طریقہ کے ساتھ Flyable انٹرفیس بنائیں۔ پھر برڈ کلاس کو لاگو کریں جو فلائی ایبل کو لاگو کرتا ہے اور اسکرین پر فلائنگ پرنٹ کرتا ہے۔
اشارہ دکھائیں۔
Flyable میں، `void fly();` لکھیں۔ برڈ کلاس میں، `@Override public void fly() { System.out.println('Flying') کے ساتھ نشان زد کرنے کے طریقہ کو نافذ کریں۔ }`
3 کوششوں کے بعد حل دستیاب ہے۔
void draw() طریقہ کے ساتھ ڈرا ایبل انٹرفیس کی وضاحت کریں۔ پھر ایک مستطیل کلاس نافذ کریں جو ڈرا ایبل کو لاگو کرتی ہے اور ڈرائنگ مستطیل کو پرنٹ کرتی ہے۔
اشارہ دکھائیں۔
انٹرفیس میں `void draw();` کی وضاحت کریں۔ مستطیل میں، `@Override public void draw() { System.out.println('Drawing Rectangle') کا استعمال کریں؛ }`
3 کوششوں کے بعد حل دستیاب ہے۔
void swim() طریقہ کی وضاحت کرکے تیرنے کے قابل انٹرفیس کو مکمل کریں۔ پھر، ڈک کلاس کو مکمل کریں تاکہ یہ فلائی ایبل اور سوئم ایبل دونوں کو لاگو کرے، فلائینگ ان دی فلائی () طریقہ اور تیراکی میں تیراکی پرنٹنگ۔
اشارہ دکھائیں۔
سوئم ایبل کے اندر `void swim();` کا اعلان کریں۔ 'کلاس ڈک کو فلائی ایبل، سوئم ایبل نافذ کرتا ہے' کا اعلان کریں اور درخواست کردہ تاروں کو پرنٹ کرنے کے دونوں طریقے نافذ کریں۔
3 کوششوں کے بعد حل دستیاب ہے۔