মডিউল পাঠ (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.");
}
}ইন্টারফেসের সুবিধা
- মাল্টিপল ইনহেরিটেন্স: জাভাতে, একটি ক্লাস only one parent class (একক উত্তরাধিকার) প্রসারিত করতে পারে, কিন্তু এটি একই সময়ে একাধিক ইন্টারফেস বাস্তবায়ন করতে পারে।
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('ফ্লাইং') দিয়ে চিহ্নিত পদ্ধতিটি প্রয়োগ করুন; }`
সমাধান 3 প্রচেষ্টার পরে উপলব্ধ
একটি অকার্যকর ড্র() পদ্ধতির সাথে একটি অঙ্কনযোগ্য ইন্টারফেস সংজ্ঞায়িত করুন। তারপরে একটি আয়তক্ষেত্রের শ্রেণী প্রয়োগ করুন যা অঙ্কনযোগ্য এবং অঙ্কন আয়তক্ষেত্রকে প্রিন্ট করে।
ইঙ্গিত দেখান
ইন্টারফেসে `void draw();` সংজ্ঞায়িত করুন। আয়তক্ষেত্রে, `@Override public void draw() { System.out.println('অংকন আয়তক্ষেত্র') ব্যবহার করুন; }`
সমাধান 3 প্রচেষ্টার পরে উপলব্ধ
void swim() পদ্ধতি সংজ্ঞায়িত করে সাঁতারযোগ্য ইন্টারফেসটি সম্পূর্ণ করুন। তারপর, হাঁসের ক্লাসটি সম্পূর্ণ করুন যাতে এটি ফ্লাইয়েবল এবং সাঁতারের উভয়ই প্রয়োগ করে, ফ্লাইং ইন দ্য ফ্লাই() পদ্ধতি এবং সাঁতারের () পদ্ধতিতে সাঁতার মুদ্রণ করে।
ইঙ্গিত দেখান
সাঁতারের ভিতরে `void swim();` ঘোষণা করুন। 'ক্লাস ডাক ইমপ্লিমেন্টস ফ্লাইবল, সাঁতার যোগ্য' ঘোষণা করুন এবং অনুরোধ করা স্ট্রিং মুদ্রণের উভয় পদ্ধতি প্রয়োগ করুন।
সমাধান 3 প্রচেষ্টার পরে উপলব্ধ