কেন ইন্টারফেস ??????
এটি একটি কুকুর দিয়ে শুরু হয়। বিশেষত, একটি pug ।
পগের বিভিন্ন আচরণ রয়েছে:
public class Pug {
private String name;
public Pug(String n) { name = n; }
public String getName() { return name; }
public String bark() { return "Arf!"; }
public boolean hasCurlyTail() { return true; } }
এবং আপনার একজন ল্যাব্রাডর আছেন, যার আচরণের একটি সেটও রয়েছে।
public class Lab {
private String name;
public Lab(String n) { name = n; }
public String getName() { return name; }
public String bark() { return "Woof!"; }
public boolean hasCurlyTail() { return false; } }
আমরা কিছু পগ এবং ল্যাব করতে পারি:
Pug pug = new Pug("Spot");
Lab lab = new Lab("Fido");
এবং আমরা তাদের আচরণের আবেদন করতে পারি:
pug.bark() -> "Arf!"
lab.bark() -> "Woof!"
pug.hasCurlyTail() -> true
lab.hasCurlyTail() -> false
pug.getName() -> "Spot"
ধরা যাক আমি একটি কুকুর কেনেল চালাচ্ছি এবং আমি যে সমস্ত কুকুরকে বাস করছি তার খোঁজ রাখা দরকার। আমি পৃথক অ্যারে আমার pugs এবং labradors সঞ্চয় করতে প্রয়োজন :
public class Kennel {
Pug[] pugs = new Pug[10];
Lab[] labs = new Lab[10];
public void addPug(Pug p) { ... }
public void addLab(Lab l) { ... }
public void printDogs() { // Display names of all the dogs } }
তবে এটি স্পষ্টতই অনুকূল নয়। যদি আমিও কিছু পোডল রাখতে চাই তবে আমাকে পোডলসের একটি অ্যারে যুক্ত করার জন্য আমার কেনেলের সংজ্ঞাটি পরিবর্তন করতে হবে। আসলে, আমার প্রতিটি ধরণের কুকুরের জন্য আলাদা অ্যারে দরকার।
অন্তর্দৃষ্টি: উভয় পগ এবং ল্যাব্রাডার (এবং পুডলস) কুকুরের ধরণের এবং তাদের আচরণের সমান সেট রয়েছে। এটি হ'ল আমরা (এই উদাহরণের উদ্দেশ্যে) বলতে পারি যে সমস্ত কুকুরের ছাল, নাম থাকতে পারে এবং কোঁকড়ানো লেজ থাকতে পারে বা নাও থাকতে পারে। সমস্ত কুকুর কী করতে পারে তা সংজ্ঞায়িত করার জন্য আমরা একটি ইন্টারফেস ব্যবহার করতে পারি, তবে সেই নির্দিষ্ট আচরণগুলি বাস্তবায়নের জন্য এটি নির্দিষ্ট ধরণের কুকুরের উপর ছেড়ে দেয়। ইন্টারফেসটি বলে যে "এখানে কুকুরগুলি করতে পারে এমন জিনিস" তবে প্রতিটি আচরণ কীভাবে করা হয় তা বলে না।
public interface Dog
{
public String bark();
public String getName();
public boolean hasCurlyTail(); }
তারপরে কুকুরের আচরণগুলি বাস্তবায়নের জন্য আমি সামান্য পগ এবং ল্যাব ক্লাস পরিবর্তন করেছি। আমরা বলতে পারি যে একটি পাগ একটি কুকুর এবং ল্যাব একটি কুকুর।
public class Pug implements Dog {
// the rest is the same as before }
public class Lab implements Dog {
// the rest is the same as before
}
আমি আগের মতো এখনও পগস এবং ল্যাবগুলি ইনস্ট্যান্ট করতে পারি, তবে এখন আমি এটি করার একটি নতুন উপায়ও পেয়েছি:
Dog d1 = new Pug("Spot");
Dog d2 = new Lab("Fido");
এটি বলে যে ডি 1 কেবল একটি কুকুর নয়, এটি বিশেষত একটি পাগল। এবং ডি 2 হ'ল একটি কুকুর, বিশেষত একটি ল্যাব। আমরা আচরণগুলি শুরু করতে পারি এবং তারা আগের মতো কাজ করে:
d1.bark() -> "Arf!"
d2.bark() -> "Woof!"
d1.hasCurlyTail() -> true
d2.hasCurlyTail() -> false
d1.getName() -> "Spot"
এখানে সমস্ত অতিরিক্ত কাজ পরিশোধ করে। কেনেল শ্রেণি অনেক সহজ হয়ে যায়। আমার কেবল একটি অ্যারে এবং একটি অ্যাডডগ পদ্ধতি দরকার। উভয়ই কুকুর যে কোনও বস্তুর সাথে কাজ করবে; এটি হ'ল কুকুর ইন্টারফেস প্রয়োগকারী বস্তুগুলি।
public class Kennel {
Dog[] dogs = new Dog[20];
public void addDog(Dog d) { ... }
public void printDogs() {
// Display names of all the dogs } }
এটি কীভাবে ব্যবহার করবেন তা এখানে:
Kennel k = new Kennel();
Dog d1 = new Pug("Spot");
Dog d2 = new Lab("Fido");
k.addDog(d1);
k.addDog(d2);
k.printDogs();
শেষ বিবৃতি প্রদর্শিত হবে: স্পট ফিডো
একটি ইন্টারফেস আপনাকে এমন আচরণের একটি সেট নির্দিষ্ট করার ক্ষমতা দেয় যা ইন্টারফেসটি বাস্তবায়িত করে এমন সমস্ত শ্রেণী সাধারণভাবে ভাগ করে নেবে। ফলস্বরূপ, আমরা ভেরিয়েবল এবং সংগ্রহগুলি সংজ্ঞায়িত করতে পারি (যেমন অ্যারেগুলি) তারা কোন ধরণের নির্দিষ্ট অবজেক্টটি ধারণ করবে তা আগাম জানতে হবে না, কেবলমাত্র তারা কেবল ইন্টারফেস প্রয়োগকারী বস্তু ধারণ করবে।