সঠিক পদ্ধতি থাকার চেয়ে ইন্টারফেসের আরও কী আছে?


159

সুতরাং আসুন আমি এই ইন্টারফেসটি বলতে পারি:

public interface IBox
{
   public void setSize(int size);
   public int getSize();
   public int getArea();
  //...and so on
}

এবং আমার একটি ক্লাস রয়েছে যা এটি প্রয়োগ করে:

public class Rectangle implements IBox
{
   private int size;
   //Methods here
}

আমি যদি ইন্টারফেস আইবক্সটি ব্যবহার করতে চাইতাম তবে আমি আসলে এটির কোনও উদাহরণ তৈরি করতে পারি না:

public static void main(String args[])
{
    Ibox myBox=new Ibox();
}

ঠিক আছে? সুতরাং আমি আসলে এটি করতে হবে:

public static void main(String args[])
{
    Rectangle myBox=new Rectangle();
}

যদি এটি সত্য হয়, তবে ইন্টারফেসের একমাত্র উদ্দেশ্যটি নিশ্চিত করা যে কোন শ্রেণিটি একটি ইন্টারফেস প্রয়োগ করে কোন ইন্টারফেস দ্বারা বর্ণিত হিসাবে এটিতে সঠিক পদ্ধতি পেয়েছে? বা ইন্টারফেসের অন্য কোন ব্যবহার আছে?


2
মনে রাখবেন, ইন্টারফেস জাভা নির্দিষ্ট নয়। সমস্ত ওওপি ভাষাগুলির এগুলি কোনও না কোনও রূপে রয়েছে, যদিও জাভা হিসাবে সর্বদা স্পষ্টভাবে সংজ্ঞায়িত হয় না।
হার্মেস 21

2
প্রযুক্তিগতভাবে, সমস্ত দৃ strongly়ভাবে টাইপ করা ওওপি ভাষাগুলির কোনও না কোনও রূপ রয়েছে। শিরোনামহীন, বা হাঁসের টাইপ করা, ভাষাগুলির মতো ধারণা নেই।
জেয়ার্ড

1
@ জ্যারেড আপনি কি স্ট্যাটিক টাইপিংয়ের সাথে শক্তিশালী টাইপিং এবং গতিশীল টাইপের সাথে "টাইপড" বিভ্রান্ত করছেন না?
এলজেঞ্জো

পলিমারফিজম ইন্টারফেসের মাধ্যমেও সম্পন্ন করা যায়। কোডেনুজেটস.কম
জেফ

উত্তর:


143

ইন্টারফেসগুলি আপনার কোডটিকে আরও নমনীয় করে তোলার একটি উপায়। আপনি যা করেন তা হ'ল:

Ibox myBox=new Rectangle();

তারপরে, আপনি যদি সিদ্ধান্ত নেন যে আপনি কোনও অন্য ধরণের বাক্স ব্যবহার করতে চান (সম্ভবত আরও একটি গ্রন্থাগার রয়েছে, আরও ভাল ধরণের বাক্স সহ) আপনি নিজের কোডটি এতে স্যুইচ করেন:

Ibox myBox=new OtherKindOfBox();

একবার আপনি এটিতে অভ্যস্ত হয়ে গেলে, আপনি এটি কাজ করার দুর্দান্ত (আসলে প্রয়োজনীয়) উপায় খুঁজে পাবেন।

আরেকটি কারণ হ'ল, উদাহরণস্বরূপ, আপনি যদি বাক্সগুলির একটি তালিকা তৈরি করতে চান এবং প্রতিটিতে কিছু অপারেশন করতে চান তবে আপনি চান তালিকায় বিভিন্ন ধরণের বাক্স রয়েছে। প্রতিটি বাক্সে আপনি করতে পারেন:

myBox.close()

(ধরে নিলাম আইবক্সের একটি ঘনিষ্ঠ () পদ্ধতি রয়েছে) যদিও আপনি মাইবক্সের আসল শ্রেণিটি পরিবর্তন করছেন আপনি কোন বাক্সে পুনরাবৃত্তি করছেন তার উপর নির্ভর করে।


54
এই উত্তরে জাভা ইন্টারফেসের সাথে একচেটিয়া এমন কিছুই নেই । এটি বিমূর্ত ক্লাসগুলি, এমনকি কংক্রিটের ক্ষেত্রেও সমানভাবে প্রযোজ্য। আমি একাধিক ইন্টারফেস বাস্তবায়নের সক্ষমতা উল্লেখ করার জন্য একটি ভাল উত্তর আশা করব এবং কখন / কেন এটি কার্যকর হবে।
রোগিরিও

16
এই উত্তর হিসাবে নির্বাচিত কিভাবে? পলিমারফিজম কেন দরকারী তা এটির একটি সংক্ষিপ্ত বিবরণ, তবে উপরের পোস্টারটি যেমন বলেছে, আমি একাধিক ইন্টারফেসের আরও ভাল ব্যাখ্যা আশা করব এবং আরও গুরুত্বপূর্ণ বিষয় যখন কোনও অ্যাবস্ট্রাক্ট ক্লাস বনাম কোনও ইন্টারফেস ব্যবহার করা উপযুক্ত হয়।
ট্র্যাভোরকাভানহো

2
পলিমারফিজমের মূল বিষয়গুলির সাথে ব্যাখ্যা করার ইন্টারফেসগুলি এবং সমস্ত কিছুর সাথে এটির খুব সামান্য সম্পর্ক রয়েছে
এ-বিকাশকারী-এর নাম নেই

123

ইন্টারফেসগুলি কী কার্যকর করে তোলে তা এই নয় যে "আপনি নিজের মত পরিবর্তন করতে পারেন এবং পরে আলাদা বাস্তবায়ন ব্যবহার করতে পারেন এবং কেবল যেখানে অজানাটি তৈরি করা হয়েছে সেখানেই পরিবর্তন করতে হবে"। এটি একটি নন ইস্যু।

আসল পয়েন্টটি ইতিমধ্যে নামে: তারা একটি ইন্টারফেসটিকে সংজ্ঞায়িত করে যে এ ইন্টারফেসটিতে পরিচালিত সমস্ত কোড ব্যবহারের জন্য যে কেউ প্রয়োগ করতে পারে। সর্বোত্তম উদাহরণ হ'ল java.util.Collectionsযা সমস্ত ধরণের দরকারী পদ্ধতি সরবরাহ করে যা ইন্টারফেসগুলিতে একচেটিয়াভাবে পরিচালনা করে যেমন যেমন sort()বা এর reverse()জন্য List। এখানে মূল বক্তব্যটি হ'ল এই কোডটি এখন এমন কোনও শ্রেণিকে বাছাই করতে বা বিপরীত করতে ব্যবহার করা যেতে পারে যা Listইন্টারফেস প্রয়োগ করে - কেবল ArrayListএবং নয় LinkedList, আপনি নিজে লেখেন এমন ক্লাসও, যা এমনভাবে প্রয়োগ করা যেতে পারে যাঁরা java.util.Collectionsকখনও লেখেননি তারা কল্পনাও করেনি।

একইভাবে, আপনি কোডটি লিখতে পারেন যা সুপরিচিত ইন্টারফেসগুলি বা আপনার সংজ্ঞায়িত ইন্টারফেসগুলিতে পরিচালিত হয় এবং অন্যান্য লোকেরা আপনাকে তাদের ক্লাস সমর্থন করার জন্য জিজ্ঞাসা না করেই আপনার কোডটি ব্যবহার করতে পারে।

ইন্টারফেসের আর একটি সাধারণ ব্যবহার হ'ল কলব্যাক্স। উদাহরণস্বরূপ, java.swing.table.TableCellRenderer , যা আপনাকে সুইং টেবিলটি একটি নির্দিষ্ট কলামে কীভাবে ডেটা প্রদর্শন করে তা প্রভাবিত করতে দেয়। আপনি সেই ইন্টারফেসটি বাস্তবায়ন করেন, একটি উদাহরণটি পাস JTableকরেন এবং টেবিলের রেন্ডারিংয়ের সময় আপনার কোডটি তার স্টাফগুলি করতে ডাকা হবে।


9
এটি বেশ ভাল উত্তর, আপনি যখন জাভা প্যাকেজ ক্লাসের উদাহরণ দিয়েছিলেন তখন আমি পছন্দ করি ...
ওয়েস কুরেশি

1
আমি পছন্দ করেছিyou can write code that operates on well-known interfaces, or interfaces you define
মণীশ কুমার

এক মুহুর্ত অপেক্ষা করুন ... কী ইন্টারফেসকে দরকারী করে তোলে [আপনার পছন্দ মতো কোনও প্রয়োগকরণ ব্যবহার করার ক্ষমতা] নয়, বরং [আপনার পছন্দ মতো কোনও প্রয়োগকরণ ব্যবহার করার ক্ষমতা]? বিপরীত ক্ষেত্রে উল্লেখ করা যদিও বেশ ভাল পয়েন্ট।
পাওয়ারসলেভ

4
@ পাওয়ারস্লেভ: এটিকে আরও প্যারাফ্রেস করুন যা ইন্টারফেসকে দরকারী করে তোলে [কোড প্রয়োগ করার ক্ষমতা যেখানে আপনার নিষেধাজ্ঞার পরিবর্তন করার সময় কেবল একটি লাইন পরিবর্তন করতে হবে] বরং [কোড লেখার ক্ষমতা যেখানে আপনি কোনও বাস্তবায়ন নির্দিষ্ট করে না সেখানেও সব]।
মাইকেল বর্গওয়ার্ট

এই টুইটটি আরও ভালো দেখায় :) স্পষ্ট করার জন্য ধন্যবাদ!
পাওয়ার্সলেভ

119

আমি যে বহু ব্যবহার পড়েছি তার মধ্যে একটি হ'ল জাভাতে একাধিক-উত্তরাধিকার-ব্যবহার-ইন্টারফেস ছাড়া এটির কঠিন:

class Animal
{
void walk() { } 
....
.... //other methods and finally
void chew() { } //concentrate on this
} 

এখন, একটি ক্ষেত্রে কল্পনা করুন যেখানে:

class Reptile extends Animal 
{ 
//reptile specific code here
} //not a problem here

কিন্তু,

class Bird extends Animal
{
...... //other Bird specific code
} //now Birds cannot chew so this would a problem in the sense Bird classes can also call chew() method which is unwanted

আরও ভাল নকশা হবে:

class Animal
{
void walk() { } 
....
.... //other methods 
} 

প্রাণীর চিবানো () পদ্ধতি নেই এবং পরিবর্তে একটি ইন্টারফেসে রাখা হয়েছে:

interface Chewable {
void chew();
}

এবং সরীসৃপ শ্রেণীর এটি এবং পাখি নয় বাস্তবায়ন করুন (যেহেতু পাখি চিবানো যায় না)

class Reptile extends Animal implements Chewable { } 

এবং পাখি সহজভাবে ইনসেস:

class Bird extends Animal { }

6
@ CHEBURASHKA এবং খারাপ নামকরণ। যদি Reptile"চিবান", তবে নিজেই "চিবিয়ে" না। এর কনভেনশন (কখনও কখনও) ইন্টারফেসগুলি নামকরণ Whateverable শুধুমাত্র প্রয়োগ করতে হবে যেখানে এটি নিখুঁত জ্ঞান করে তোলে। ইন্টারফেসটির নামকরণ Predatorএখানে আরও উপযুক্ত হবে।
পাওয়ারস্লেভ

6
@ পোয়ারস্লাভ এটি সঠিক ইমো, একটি সরীসৃপ "চিবিয়ে নিতে সক্ষম" / "চর্বনযোগ্য"। একজন বাজপাখি একটি শিকারী তবে তবুও চিবানো যায় না ... কেবল নিটপিকিং করা তবে ইন্টারফেসের ডকুমেন্টেশনে "চেয়ামেবল" আরও ভাল সংজ্ঞা দেওয়া যেতে পারে।
ম্যাডমিনিও

চমত্কার .. খুব ভাল ব্যাখ্যা করা হয়েছে। ধন্যবাদ..!
গুরুসিংহে

1
আমি পাই না। সমস্ত কিছু দেখে মনে হচ্ছে যে ইন্টারফেসগুলি প্রতিটি শ্রেণিতে এটি প্রয়োগ করে একই পদ্ধতি প্রয়োগ করে তা নিশ্চিত করার একটি ভাল উপায় (উদাহরণস্বরূপ, এটি আমাকে রান () এবং একটি কুকুর শ্রেণীর সাথে একটি পাখি শ্রেণির বোকা পছন্দ করতে বাধা দেয়) রান দিয়ে () - তারা সবাই এক রকম। কিন্তু মনোযোগ দিয়ে এবং আমার ক্লাসগুলির একই পদ্ধতি ফর্ম্যাট / কাঠামো তৈরি করে, আমি কি এই একই জিনিসটি অর্জন করতে পারি না? সত্যই ইন্টারফেসগুলির মতো মনে হয় কেবল প্রোগ্রামার ভুলে যাওয়া হচ্ছে না তা নিশ্চিত করে। এছাড়াও, ইন্টারফেসগুলি আমার সময় বাঁচায় বলে মনে হয় না; আমার এখনও প্রতিটি ক্লাসে এটি প্রয়োগ করে এমন পদ্ধতি নির্ধারণ করতে হবে।
অ্যালেক্স জি

@ অ্যালেক্সজি - আমি বহু ব্যবহারের মধ্যে একটিতে ডাবকে বলেছি :) আরও রয়েছে, আমরা সাধারণ ফ্যাশনে প্রশ্নের উত্তর দেওয়ার জন্য পৃষ্ঠটি সবে ছিটিয়েছি!
পিসভে

47

ইন্টারফেসের উদ্দেশ্য হ'ল বহুমুখীতা , ওরফে টাইপ প্রতিস্থাপন । উদাহরণস্বরূপ, নিম্নলিখিত পদ্ধতি দেওয়া:

public void scale(IBox b, int i) {
   b.setSize(b.getSize() * i);
}

scaleপদ্ধতিটি কল করার সময় , আপনি এমন কোনও মান প্রদান করতে পারেন যা IBoxইন্টারফেস প্রয়োগ করে এমন ধরণের । অন্য কথায়, যদি Rectangleএবং Squareউভয়ই প্রয়োগ করে তবে IBoxআপনি যেখানেই প্রত্যাশিত সেখানে Rectangleবা এক সরবরাহ করতে পারেন ।SquareIBox


8
কেন আমি ইতিমধ্যে সাবক্লাসিং এবং পদ্ধতি ওভাররাইড সহ জাভাতে এটি অর্জন করতে পারি যদি ইন্টারফেসগুলির বহুমুখী উদ্দেশ্য?
এলজেনসো

1
এটি একই জিনিস, ইন্টারফেসগুলি অবশ্যই কোনও বাস্তবায়ন বাদ দিতে পারে it ক্লাসগুলি একাধিক ইন্টারফেস প্রয়োগ করতে পারে।
অ্যাপোক্যালিস্প

4
আরে, আমি কখনও বলিনি যে জাভাতে কোনও ধরণের ধারণাগত অখণ্ডতা ছিল। প্রকারের প্রতিস্থাপন হ'ল সকল সাব-টাইপিংয়ের উদ্দেশ্য। জাভাতে একাধিক সাব-টাইপিং মেকানিজম রয়েছে যাগুলির মধ্যে বিশেষত ভাল কিছু নেই।
অ্যাপোক্যালিস্প

1
আমি ধারণাগত অখণ্ডতা সম্পর্কে কখনও কিছু বলিনি। তবে চলুন। আপনি যদি প্রতিটি পদ্ধতিটি আপনার পদ্ধতিতে স্কেল করতে পারেন তবে এটি আইবক্স: আইবক্স.স্কেল (ইনট)-তে ঘোষিত কোনও অপারেশন হওয়া উচিত নয়?
এলজেঞ্জো

1
আমরা আইবক্সের সাথে পূর্ণসংখ্যার সংযোজন করতে চাই না, এজন্য আমরা এটি পূর্ণসংখ্যার জন্য কোনও পদ্ধতি করি না। এবং কোনও ইন্টারফেসে পদ্ধতির সংখ্যা নির্ধারণ করা বিমূর্ততার ধারাবাহিকতা এবং একাত্মতার দ্বারা সিদ্ধান্ত নেওয়া হয়, এটি বাস্তবায়নে কতটা কষ্টকর হবে তা নয়। যাইহোক, আপো আপনার উত্তরগুলির জন্য ধন্যবাদ।
এলজেনসো

33

ইন্টারফেস স্ট্যাটিক্যালি টাইপ করা ভাষাগুলি পলিমারফিজম সমর্থন করে। একটি অবজেক্ট ওরিয়েন্টেড পিউরিস্ট জোর দিয়েছিলেন যে কোনও ভাষার পুরোপুরি বৈশিষ্ট্যযুক্ত অবজেক্ট ওরিয়েন্টেড ভাষা হওয়ার জন্য উত্তরাধিকার, এনক্যাপসুলেশন, মডিউলারিটি এবং বহুবিজ্ঞান সরবরাহ করা উচিত। গতিশীলভাবে টাইপযুক্ত - বা হাঁসের টাইপড - ভাষায় (স্মলটালকের মতো) পলিমারফিজম খুব তুচ্ছ; তবে, স্ট্যাটিক্যালি টাইপ করা ভাষায় (জাভা বা সি # এর মতো) পলিমারফিজম তুচ্ছ থেকে অনেক দূরে (বাস্তবে, দৃ strong়ভাবে এটি শক্তিশালী টাইপিংয়ের ধারণার সাথে মতবিরোধের বলে মনে হয়।)

আমাকে প্রদর্শন করুন:

ডায়নামিক্যালি টাইপড (বা হাঁসের টাইপড) ভাষায় (স্মলটালকের মতো) সমস্ত ভেরিয়েবলগুলি অবজেক্টের রেফারেন্স (কম কিছু না এবং বেশি কিছুই নয়।) সুতরাং, স্মলটাল্কে আমি এটি করতে পারি:

|anAnimal|    
anAnimal := Pig new.
anAnimal makeNoise.

anAnimal := Cow new.
anAnimal makeNoise.

এই কোড:

  1. অ্যানিমাল নামে একটি স্থানীয় ভেরিয়েবল ঘোষণা করে (নোট করুন যে আমরা ভেরিয়েবলের TYPE নির্দিষ্ট করি না - সমস্ত ভেরিয়েবলগুলি কোনও অবজেক্টের রেফারেন্স, কম বেশি এবং কম কিছু নয়।)
  2. "পিগ" নামে শ্রেণীর একটি নতুন উদাহরণ তৈরি করে
  3. পিগের সেই নতুন উদাহরণটি অ্যানিমাল ভ্যারিয়েবলের জন্য বরাদ্দ করে।
  4. makeNoiseশুয়োরের কাছে বার্তা পাঠায় ।
  5. একটি গাভী ব্যবহার করে পুরো জিনিস পুনরাবৃত্তি করে, তবে এটিকে শূকের মতো একই নির্ভুল ভেরিয়েবলে নির্ধারণ করে।

একই জাভা কোডটি দেখতে এরকম কিছু হবে (এই ধারণাটি তৈরি করা হচ্ছে যে হাঁস এবং গাভীটি প্রাণীর উপশ্রেণী:

Animal anAnimal = new Pig();
duck.makeNoise();

anAnimal = new Cow();
cow.makeNoise();

আমরা সবজির ক্লাস চালু না করা পর্যন্ত এটি বেশ ভাল এবং ভাল। শাক-সবজির কিছু হ'ল প্রাণীর মতো একই আচরণ রয়েছে তবে সবকটিই নয়। উদাহরণস্বরূপ, প্রাণী এবং উদ্ভিজ্জ উভয়ই বাড়তে সক্ষম হতে পারে, তবে স্পষ্টতই শাকসব্জি শব্দ করে না এবং প্রাণীগুলিও কাটা যায় না।

স্মলটাল্কে আমরা এটি লিখতে পারি:

|aFarmObject|
aFarmObject := Cow new.
aFarmObject grow.
aFarmObject makeNoise.

aFarmObject := Corn new.
aFarmObject grow.
aFarmObject harvest.

এটি স্মল্টাল্কে পুরোপুরি ভালভাবে কাজ করে কারণ এটি হাঁসের মতো টাইপড (যদি এটি হাঁসের মতো হাঁটে এবং হাঁসের মতো কোঁক দেয় - এটি একটি হাঁস is) এই ক্ষেত্রে যখন কোনও বস্তুর কাছে কোনও বার্তা প্রেরণ করা হয়, তখন একটি অনুসন্ধান করা হবে on গ্রহীতার পদ্ধতির তালিকা, এবং যদি কোনও মিলে যাওয়া পদ্ধতি পাওয়া যায়, তবে তাকে বলা হয়। যদি তা না হয় তবে কোনও ধরণের NoSuchMethodError ব্যতিক্রম নিক্ষেপ করা হয় - তবে এটি রানটাইম সময়ে সম্পন্ন হয়েছে।

তবে জাভাতে, একটি স্ট্যাটিকালি টাইপড ল্যাঙ্গুয়েজ, আমরা আমাদের ভেরিয়েবলের জন্য কোন প্রকারটি বরাদ্দ করতে পারি? ভুট্টাকে শাকসব্জির থেকে উত্তরাধিকারী হওয়া দরকার, বেড়ে ওঠা সমর্থন করা উচিত, তবে প্রাণীর কাছ থেকে উত্তরাধিকারী হতে পারে না, কারণ এটি শব্দ করে না। মেকনিউজকে সমর্থন করার জন্য গরুকে অ্যানিমাল থেকে উত্তরাধিকারী হওয়া দরকার, তবে উদ্ভিজ্জের কাছ থেকে উত্তরাধিকারী হতে পারে না কারণ এটি ফসল কাটা উচিত নয়। দেখে মনে হচ্ছে আমাদের একাধিক উত্তরাধিকার দরকার - একাধিক শ্রেণির উত্তরাধিকারী হওয়ার ক্ষমতা। তবে পপ আপ হওয়া সমস্ত প্রান্তের ক্ষেত্রে (এটি যদি একাধিক সমান্তরাল সুপারক্লাস একই পদ্ধতি প্রয়োগ করে তখন কী ঘটে?) ইত্যাদি কারণ এটি একটি বেশ কঠিন ভাষা বৈশিষ্ট্য হিসাবে দেখা যায়)

ইন্টারফেসের পাশাপাশি আসুন ...

যদি আমরা প্রতিটি প্রয়োগযোগ্য গ্রোয়েবলের সাথে অ্যানিম্যাল এবং ভেজিটেবল ক্লাস করি তবে আমরা ঘোষণা করতে পারি যে আমাদের গরুটি প্রাণী এবং আমাদের ভুট্টা শাকসব্জী। আমরা ঘোষণা করতে পারি যে প্রাণী এবং সবজি উভয়ই আবাদযোগ্য। এটি আমাদের সবকিছু বাড়ানোর জন্য এটি লিখতে দেয়:

List<Growable> list = new ArrayList<Growable>();
list.add(new Cow());
list.add(new Corn());
list.add(new Pig());

for(Growable g : list) {
   g.grow();
}

এবং এটি আমাদেরকে এটি করতে, পশুদের শোরগোল করতে দেয়:

List<Animal> list = new ArrayList<Animal>();
list.add(new Cow());
list.add(new Pig());
for(Animal a : list) {
  a.makeNoise();
}

হাঁসের-টাইপযুক্ত ভাষার সুবিধা হ'ল আপনি সত্যিই খুব সুন্দর পলিমারফিজম পেয়েছেন: আচরণ প্রদানের জন্য সমস্ত শ্রেণীর করণীয় হ'ল পদ্ধতি সরবরাহ করা। যতক্ষণ না সবাই দুর্দান্ত খেলেন, এবং কেবলমাত্র সংজ্ঞাযুক্ত পদ্ধতির সাথে মেলে এমন বার্তাগুলি প্রেরণ করেন যতক্ষণ না all খারাপ দিকটি হ'ল নীচের ধরণের ত্রুটি রানটাইম পর্যন্ত ধরা পড়ে না:

|aFarmObject|
aFarmObject := Corn new.
aFarmObject makeNoise. // No compiler error - not checked until runtime.

স্ট্যাটিক্যালি টাইপ করা ভাষাগুলি "চুক্তি অনুসারে প্রোগ্রামিং" এর চেয়ে আরও ভাল সরবরাহ করে কারণ তারা সংকলন সময়ে নীচে দুই ধরণের ত্রুটি ধরবে:

// Compiler error: Corn cannot be cast to Animal.
Animal farmObject = new Corn();  
farmObject makeNoise();

-

// Compiler error: Animal doesn't have the harvest message.
Animal farmObject = new Cow();
farmObject.harvest(); 

সুতরাং .... সংক্ষেপে:

  1. ইন্টারফেস বাস্তবায়ন আপনাকে কী ধরণের জিনিসগুলি (ইন্টারঅ্যাকশন) করতে পারে তা নির্দিষ্ট করতে দেয় এবং শ্রেণি উত্তরাধিকার আপনাকে কীভাবে কী কী করা উচিত তা (নির্ধারণ) নির্দিষ্ট করতে দেয়।

  2. ইন্টারফেসগুলি সংকলক প্রকারের পরীক্ষার ত্যাগ ছাড়াই আমাদের "সত্য" বহুমুখীতার অনেক সুবিধা দেয়।


2
এটি অন্য প্রশ্নের আমার উত্তরের পাঠ্য: স্ট্যাকওভারফ্লো . com / প্রশ্নস / 937৯২২/২ । তবে, তারা সম্পর্কিত উত্তর।
জেয়ার্ড

2
সুতরাং আমি জিজ্ঞাসা করতে পারি, হাঁসের টাইপ করা ভাষা কীভাবে অ্যানিমাল.ওয়াটার (), (যাঁরা বুদ্ধিমান কৃষক বলতেন যে এটি একটি ফুটো লাগে) এবং প্ল্যান্ট.ওয়াটার () যা তিনি উদ্ভিদগুলিকে জল ব্যবহার করতে ব্যবহার করেন তার মধ্যে পার্থক্য করতে পারে। অস্পষ্টতা শত্রু। অস্পষ্টতা কাটিয়ে উঠতে প্রয়োজনীয় যে পরিমাণ ভার্বোসিটি তা গ্রহণযোগ্য আইএমও।
বিল কে

1
হ্যাঁ..অ্যাম্পিগুইটি হ'ল হাঁসের টাইপ করা ভাষার সাথে নাম। হাঁস টাইপ করা ভাষায় পেশাদারভাবে কাজ করার সময়, সদস্যদের (পদ্ধতি এবং ভেরিয়েবল) নামগুলি 50-100 অক্ষরের দৈর্ঘ্যের সাথে দেখতে অস্বাভাবিক কিছু নয়।
জ্যারেড

1
হাঁসের প্রকারভেদযুক্ত ভাষাগুলির আরেকটি বড় নেতিবাচকতা হ'ল স্থির বিশ্লেষণের উপর ভিত্তি করে প্রোগ্রাম্যাটিক রিফ্যাক্টরিং করতে অক্ষমতা - আপনার প্রিন্টস্ট্রিং পদ্ধতির সমস্ত কলারদের তালিকার জন্য একটি স্মলটাক চিত্র জিজ্ঞাসা করার চেষ্টা করুন ... আপনি সমস্ত প্রিন্ট স্ট্রিং পদ্ধতির সমস্ত কলারের তালিকা পাবেন। ...
জ্যারেড

... কারণ অটোমোবাইল # মুদ্রণযন্ত্রের কলকারী প্রোগ্রামের কাছাকাছি থাকা আর্থআরবিট # প্রিন্টস্ট্রিংয়ের কলকারী থেকে পৃথক হতে পারে না।
জেয়ার্ড

9

সাধারণত ইন্টারফেসগুলি আপনার ব্যবহার করা উচিত ইন্টারফেসটি সংজ্ঞায়িত করে (নামটি যেমন এটি বলে ;-))। নমুনা


public void foo(List l) {
   ... do something
}

এখন আপনার ফাংশন কেবলমাত্র এক ধরণের নয়, এস, এস, fooগ্রহণ করে ।ArrayListLinkedList

জাভাতে সর্বাধিক গুরুত্বপূর্ণ বিষয় হ'ল আপনি একাধিক ইন্টারফেস প্রয়োগ করতে পারবেন তবে আপনি কেবল এক ক্লাস প্রসারিত করতে পারবেন! নমুনা:


class Test extends Foo implements Comparable, Serializable, Formattable {
...
}
সম্ভব তবে

class Test extends Foo, Bar, Buz {
...
}
এটি না!

আপনার কোড উপরে এছাড়াও হতে পারে: IBox myBox = new Rectangle();। গুরুত্বপূর্ণ বিষয়টি এখন হ'ল, যে মাইবক্সে কেবলমাত্র আইবক্সের পদ্ধতি / ক্ষেত্রগুলি রয়েছে এবং সেগুলির (সম্ভবত বিদ্যমান) অন্যান্য পদ্ধতি নয় Rectangle


1
'তালিকা' একটি ইন্টারফেস সদস্য হতে অনুমিত হয়?
শে

1
তালিকাটি জাভা সংগ্রহ লাইব্রেরির একটি ইন্টারফেস।
rmeador 21

তালিকাটি স্ট্যান্ডার্ড জাভা লাইব্রেরিতে একটি ইন্টারফেস ( java.sun.com/javase/6/docs/api/java/util/List.html )। তিনি কেবল তার বিষয়টি বোঝাতে এটি ব্যবহার করছেন।
মাইকেল ময়র্স

6

আমি মনে করি আপনি ইন্টারফেসগুলি যা কিছু করেন তা বুঝতে পেরেছেন, তবে আপনি এখনও কোনও পরিস্থিতি কল্পনা করছেন না যে কোনও ইন্টারফেস কার্যকর।

যদি আপনি তাত্ক্ষণিকভাবে ব্যবহার করছেন এবং কোনও সংক্ষিপ্ত সুযোগের মধ্যে সমস্ত বস্তু প্রকাশ করছেন (উদাহরণস্বরূপ, একটি পদ্ধতি কলের মধ্যে), একটি ইন্টারফেস সত্যিই কিছু যুক্ত করে না। আপনি যেমন উল্লেখ করেছেন, কংক্রিট শ্রেণি পরিচিত হয়।

ইন্টারফেসগুলি যেখানে দরকারী তখন যখন কোনও বস্তুটি এক জায়গায় তৈরি করা দরকার এবং কলারের কাছে ফিরে আসে যা বাস্তবায়নের বিশদটি যত্ন করে না। আসুন আপনার আইবক্স উদাহরণটি আকারে পরিবর্তন করুন। এখন আমরা আকারের যেমন রেক্টাঙ্গেল, বৃত্ত, ত্রিভুজ ইত্যাদি বাস্তবায়ন করতে পারি, প্রতিটি কংক্রিট শ্রেণীর জন্য getArea () এবং getSize () পদ্ধতি প্রয়োগ করা সম্পূর্ণ আলাদা হবে।

এখন আপনি বিভিন্ন কার্টशेপ (প্যারাম) পদ্ধতি সহ কারখানাটি ব্যবহার করতে পারেন যা পাস হওয়া প্যারামগুলির উপর নির্ভর করে একটি উপযুক্ত শেপ ফিরিয়ে দেবে Ob স্পষ্টতই, কারখানাটি কী ধরণের শেপ তৈরি হচ্ছে তা সম্পর্কে জানবে, তবে কলারটি থাকবে না এটি চেনাশোনা, বা বর্গক্ষেত্র, ইত্যাদির বিষয়ে যত্নশীল।

এখন, কল্পনা করুন যে আপনার আকারগুলিতে আপনাকে বিভিন্ন ধরণের অপারেশন করতে হবে। হতে পারে আপনাকে এটিকে অঞ্চল অনুসারে বাছাই করতে হবে, সেগুলি একটি নতুন আকারে সেট করতে হবে এবং তারপরে একটি ইউআইতে প্রদর্শন করবে। শেপগুলি সমস্ত ফ্যাক্টরি দ্বারা তৈরি করা হয় এবং তারপরে খুব সহজেই सॉर्টার, সিজার এবং ডিসপ্লে ক্লাসে পাস করা যায়। ভবিষ্যতে যদি আপনাকে কিছু সময় ষড়ভুজ শ্রেণি যুক্ত করতে হয় তবে আপনাকে কারখানা ছাড়া আর কোনও পরিবর্তন করতে হবে না। ইন্টারফেস ব্যতীত, অন্য একটি আকৃতি যুক্ত করা একটি খুব অগোছালো প্রক্রিয়া হয়ে যায়।


6

আপনি করতে পারে

Ibox myBox = new Rectangle();

আপনি এই বিষয়টিকে আইবক্স হিসাবে ব্যবহার করছেন এবং আপনি এটি যত্নবান হন না Rectangle


তার মানে আমরা কি এভাবে লিখতে পারি ?! > আয়তক্ষেত্র ইনস্ট্যান্ট = নতুন আয়তক্ষেত্র ();
ডাঃ জ্যাকি

@ মিঃ হাইড যদি আপনি পরে যুক্ত Squareকরতে চান তবে আপনার কোনও সমস্যা আছে .... আপনি যদি ইন্টারফেস ছাড়াই এটি করার চেষ্টা করেন তবে আপনি তার গ্যারান্টি দিতে পারবেন না Squareএবং Rectangleএকই পদ্ধতিগুলি পাবেন ... এটি যখন আপনার দুঃস্বপ্নের কারণ হতে পারে একটি বৃহত্তর কোড বেস ... মনে রাখবেন, ইন্টারফেস একটি টেমপ্লেট সংজ্ঞায়িত করে।
কলব ক্যানিয়ন

6

কেন ইন্টারফেস ??????

এটি একটি কুকুর দিয়ে শুরু হয়। বিশেষত, একটি 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();

শেষ বিবৃতি প্রদর্শিত হবে: স্পট ফিডো

একটি ইন্টারফেস আপনাকে এমন আচরণের একটি সেট নির্দিষ্ট করার ক্ষমতা দেয় যা ইন্টারফেসটি বাস্তবায়িত করে এমন সমস্ত শ্রেণী সাধারণভাবে ভাগ করে নেবে। ফলস্বরূপ, আমরা ভেরিয়েবল এবং সংগ্রহগুলি সংজ্ঞায়িত করতে পারি (যেমন অ্যারেগুলি) তারা কোন ধরণের নির্দিষ্ট অবজেক্টটি ধারণ করবে তা আগাম জানতে হবে না, কেবলমাত্র তারা কেবল ইন্টারফেস প্রয়োগকারী বস্তু ধারণ করবে।


@ নিরঞ্জন কুরম্ভট্টি আমি কুকুর প্রসারিত করার জন্য সব ক্লাস করতে পারি তবে কেন ইন্টারফেস ??
জিভা

3

ইন্টারফেস কীভাবে ব্যবহৃত হয় তার একটি দুর্দান্ত উদাহরণ সংগ্রহের কাঠামোর মধ্যে। আপনি যদি একটি ফাংশন লিখেন যা একটি নেয় List, তবে ব্যবহারকারী কোনও Vectorবা একটি ArrayListবা একটি HashListবা যা কিছুতেই পাস করে তা বিবেচনা করে না । এবং আপনি এটি Listকোনও Collectionবা Iterableইন্টারফেসের প্রয়োজন হয় এমন কোনও ফাংশনেও পাস করতে পারেন ।

এটি Collections.sort(List list)কীভাবে Listবাস্তবায়িত হয় তা নির্বিশেষে এটি কার্যকারিতা যেমন সম্ভব করে তোলে ।


3

এই কারণেই কারখানার প্যাটার্নস এবং অন্যান্য সৃষ্টিশীল নিদর্শনগুলি জাভাতে এত জনপ্রিয়। আপনি ঠিক বলেছেন যে এগুলি ছাড়া জাভা তাত্ক্ষণিকতার সহজ বিমোচনার জন্য বক্স প্রক্রিয়াটির বাইরে কোনও সরবরাহ করে না। তবুও, আপনি যেখানেই না করেন সেখানে বিমূর্ততা পাবেন আপনার পদ্ধতিতে কোনও অবজেক্ট তৈরি করেন , যা আপনার কোডের সর্বাধিক হওয়া উচিত।

অন্যদিকে, আমি সাধারণত লোকদের উত্সাহ দেওয়ার জন্য ইন্টারফেসের নামকরণের জন্য "IRealname" প্রক্রিয়াটি অনুসরণ না করার জন্য উত্সাহিত করি। এটি একটি উইন্ডোজ / সিওএম জিনিস যা হাঙ্গেরিয়ান স্বরলিপিটির কবরে এক পা রাখে এবং সত্যই প্রয়োজন হয় না (জাভা ইতিমধ্যে দৃ strongly়ভাবে টাইপ করা হয়েছে, এবং ইন্টারফেসগুলির পুরো বিন্দুটি সম্ভবত শ্রেণীর ধরণের থেকে যতটা পৃথক পৃথক হতে পারে)।


1
আপনি স্ট্যাটিক টাইপিংয়ের সাথে শক্ত টাইপিংকে বিভ্রান্ত করছেন।
এলজেনসো

3

ভুলে যাবেন না যে পরবর্তী তারিখে আপনি একটি বিদ্যমান শ্রেণি নিতে পারেন এবং এটি বাস্তবায়ন করতে পারেনIBox এবং এটি আপনার সমস্ত বাক্স-সচেতন কোডের জন্য উপলব্ধ হয়ে যাবে।

ইন্টারফেসগুলির নামকরণযোগ্য-এ নামকরণ করা গেলে এটি কিছুটা স্পষ্ট হয় । যেমন

public interface Saveable {
....

public interface Printable {
....

ইত্যাদি (নামকরণের স্কিমগুলি সর্বদা কাজ করে না যেমন আমি নিশ্চিত না যে Boxableএখানে উপযুক্ত কিনা )


3

ইন্টারফেসের একমাত্র উদ্দেশ্যটি নিশ্চিত করা কি যে শ্রেণিটি একটি ইন্টারফেস প্রয়োগ করে কোন ইন্টারফেস দ্বারা বর্ণিত হিসাবে এটিতে সঠিক পদ্ধতি পেয়েছে? বা ইন্টারফেসের অন্য কোন ব্যবহার আছে?

আমি উত্তরটি ইন্টারফেসের নতুন বৈশিষ্ট্যগুলির সাথে আপডেট করছি, যা জাভা 8 এর সাথে প্রবর্তিত হয়েছে সংস্করণের ।

ইন্টারফেসের সারাংশে ওরাকল ডকুমেন্টেশন পৃষ্ঠা থেকে :

একটি ইন্টারফেস ঘোষণায় থাকতে পারে

  1. পদ্ধতি স্বাক্ষর
  2. ডিফল্ট পদ্ধতি
  3. স্থির পদ্ধতি
  4. ধ্রুব সংজ্ঞা

বাস্তবায়নের একমাত্র পদ্ধতি হ'ল ডিফল্ট এবং স্থিতিশীল পদ্ধতি।

ইন্টারফেসের ব্যবহার :

  1. একটি চুক্তি সংজ্ঞায়িত করা
  2. সম্পর্কিত নয় এমন ক্লাসগুলির সাথে লিঙ্ক স্থাপনের একটি ক্ষমতা রয়েছে (উদাহরণস্বরূপ ক্লাসগুলি প্রয়োগকারী Serializableইন্টারফেসটি সেই ইন্টারফেস বাস্তবায়ন ব্যতীত তাদের মধ্যে কোনও সম্পর্ক থাকতে পারে বা নাও থাকতে পারে
  3. বিনিময়যোগ্য বাস্তবায়ন যেমন কৌশল প্যাটার্ন প্রদান
  4. ডিফল্ট পদ্ধতি আপনাকে আপনার লাইব্রেরির ইন্টারফেসগুলিতে নতুন কার্যকারিতা যুক্ত করতে এবং সেই ইন্টারফেসগুলির পুরানো সংস্করণগুলির জন্য লিখিত কোডের সাথে বাইনারি সামঞ্জস্যতা নিশ্চিত করতে সক্ষম করে
  5. স্থিতিশীল পদ্ধতির সাহায্যে আপনার লাইব্রেরিতে সহায়ক পদ্ধতিগুলি সংগঠিত করুন (আপনি পৃথক শ্রেণীর পরিবর্তে একই ইন্টারফেসে স্থির পদ্ধতি নির্দিষ্ট রাখতে পারেন)

অ্যাবস্ট্রাক্ট ক্লাস এবং ইন্টারফেসের মধ্যে পার্থক্য এবং কাজের উদাহরণগুলির সাথে কেস ব্যবহারের ক্ষেত্রে কিছু সম্পর্কিত এসই প্রশ্ন :

একটি ইন্টারফেস এবং বিমূর্ত শ্রেণীর মধ্যে পার্থক্য কী?

একটি ইন্টারফেস এবং একটি বিমূর্ত শ্রেণীর মধ্যে পার্থক্যটি আমি কীভাবে ব্যাখ্যা করব?

জাভা 8: ডিফল্ট পদ্ধতি এবং স্থিতিশীল পদ্ধতিতে যুক্ত হওয়া নতুন বৈশিষ্ট্যগুলি বোঝার জন্য ডকুমেন্টেশন পৃষ্ঠায় একবার দেখুন ।


আমি জাভা -8 ট্যাগটি মুছে ফেলি কারণ প্রশ্নটি জাভা -8 সম্পর্কে কিছু জিজ্ঞাসা করে না (এবং আসলে জাভা -8 এর আগে দীর্ঘ সময় জিজ্ঞাসা করা হয়েছিল)। ট্যাগগুলি প্রশ্নের জন্য, উত্তরগুলির জন্য নয়।
তাগীর ভালিভ

2

ইন্টারফেসের উদ্দেশ্য বিমূর্ত করা বা বাস্তবায়ন থেকে ডিকপলিং।

আপনি যদি আপনার প্রোগ্রামে কোনও বিমূর্ততা প্রবর্তন করেন, আপনি সম্ভাব্য প্রয়োগগুলি সম্পর্কে চিন্তা করবেন না। আপনি আগ্রহী কি এবং এটা করতে পারেন না কিভাবে , এবং আপনি একটি ব্যবহার interfaceজাভা এই প্রকাশ করার।


সমস্ত কাঠামোগত প্রোগ্রামিংয়ের উদ্দেশ্য বিমূর্ততা। আপনি কেন বলবেন যে ইন্টারফেসের উদ্দেশ্য বিমূর্তি, যেহেতু আমি জেনেরিকস এবং শ্রেণি রচনা ব্যবহার করে সঠিক জিনিসটি অর্জন করতে পারি?
অ্যাপোক্যালিস্প

1
সমস্ত কাঠামোগত প্রোগ্রামিং যদি বিমূর্ততা হয় (আপনার দাবি), তবে ইন্টারফেসগুলি বিমূর্তিতে বিমূর্ততা।
এলজেঞ্জো

1

আপনার যদি কার্ডবোর্ডবক্স এবং এইচটিএমএলবক্স (উভয়ই আইবক্স প্রয়োগ করে) থাকে তবে আপনি উভয়কেই কোনও আইবক্স গ্রহণযোগ্য কোনও পদ্ধতিতে পাস করতে পারেন। যদিও এগুলি উভয়ই পৃথক এবং সম্পূর্ণ পৃথকভাবে পরিবর্তনযোগ্য নয়, যে পদ্ধতিগুলি "উন্মুক্ত" বা "পুনরায় আকার" দেওয়ার বিষয়ে চিন্তা করে না সেগুলি এখনও আপনার ক্লাস ব্যবহার করতে পারে (সম্ভবত তারা কোনও পর্দায় কিছু প্রদর্শন করার জন্য কত পিক্সেল প্রয়োজন সে বিষয়ে যত্নশীল)।


1

ইন্টারফেসগুলি যেখানে একাধিক উত্তরাধিকারের অনুমতি দেওয়ার জন্য একটি প্রতিভা জাভাতে যুক্ত হয়েছিল। জাভা বিকাশকারীরা যদিও / বুঝতে পেরেছিলেন যে একাধিক উত্তরাধিকার প্রাপ্তি একটি "বিপজ্জনক" বৈশিষ্ট্য, এজন্যই একটি ইন্টারফেসের ধারণাটি এসেছিল।

একাধিক উত্তরাধিকার বিপজ্জনক কারণ আপনার নীচের মতো ক্লাস থাকতে পারে:


class Box{
    public int getSize(){
       return 0;
    }
    public int getArea(){
       return 1;
    }

}

class Triangle{
    public int getSize(){
       return 1;
    }
    public int getArea(){
       return 0;
    }

}

class FunckyFigure extends Box, Triable{
   // we do not implement the methods we will used the inherited ones
}

আমরা ব্যবহার করার সময় কল করা উচিত যা পদ্ধতি হবে


   FunckyFigure.GetArea(); 

সমস্ত সমস্যা ইন্টারফেসের সাথে সমাধান করা হয়, কারণ আপনি জানেন যে আপনি ইন্টারফেসগুলি প্রসারিত করতে পারবেন এবং তাদের শ্রেণিবদ্ধের পদ্ধতি থাকবে না ... অবশ্যই সংকলকটি দুর্দান্ত এবং আপনি যদি কোনও পদ্ধতি প্রয়োগ করেন নি তবে আপনাকে তা বলতে চাই তবে আমি এটি ভাবতে চাই আরও আকর্ষণীয় ধারণার একটি পার্শ্ব প্রতিক্রিয়া।


আপনি আপনার উত্তরে একাধিক বাস্তবায়ন উত্তরাধিকার এবং একাধিক ইন্টারফেস উত্তরাধিকারের মধ্যে পার্থক্য তৈরি করতে চাইতে পারেন, অন্যথায় এটি বিভ্রান্তিকর হয়ে ওঠে।
এলজেনসো

0

ইন্টারফেস সুবিধা সম্পর্কে আমার বোঝার জন্য এখানে। আমি ভুল হলে আমাকে সংশোধন করুন। কল্পনা করুন যে আমরা ওএস বিকাশ করছি এবং অন্যান্য দল কিছু ডিভাইসের জন্য ড্রাইভার বিকাশ করছে। সুতরাং আমরা একটি ইন্টারফেস স্টোরেজডভাইস তৈরি করেছি। আমাদের অন্যান্য বিকাশকারী দল দ্বারা সরবরাহ করা (এফডিডি এবং এইচডিডি) এর দুটি বাস্তবায়ন রয়েছে।

তারপরে আমাদের কাছে একটি অপারেটিং সিস্টেম ক্লাস রয়েছে যা কেবলমাত্র স্টোরেজডেভাইস ইন্টারফেস প্রয়োগ করে শ্রেণীর একটি উদাহরণ পেরিয়ে SaveData এর মতো ইন্টারফেস পদ্ধতিতে কল করতে পারে।

এখানে সুবিধাটি হ'ল আমরা ইন্টারফেসটি প্রয়োগের বিষয়ে চিন্তা করি না। অন্য দলটি স্টোরেজ ডিভাইস ইন্টারফেস প্রয়োগ করে কাজটি করবে।

package mypack;

interface StorageDevice {
    void saveData (String data);
}


class FDD implements StorageDevice {
    public void saveData (String data) {
        System.out.println("Save to floppy drive! Data: "+data);
    }
}

class HDD implements StorageDevice {
    public void saveData (String data) {
        System.out.println("Save to hard disk drive! Data: "+data);
    }
}

class OperatingSystem {
    public String name;
    StorageDevice[] devices;
    public OperatingSystem(String name, StorageDevice[] devices) {

        this.name = name;
        this.devices = devices.clone();

        System.out.println("Running OS " + this.name);
        System.out.println("List with storage devices available:");
        for (StorageDevice s: devices) {
            System.out.println(s);
        }

    }

    public void saveSomeDataToStorageDevice (StorageDevice storage, String data) {
        storage.saveData(data);
    }
}

public class Main {

    public static void main(String[] args) {

        StorageDevice fdd0 = new FDD();
        StorageDevice hdd0 = new HDD();     
        StorageDevice[] devs = {fdd0, hdd0};        
        OperatingSystem os = new OperatingSystem("Linux", devs);
        os.saveSomeDataToStorageDevice(fdd0, "blah, blah, blah...");    
    }
}

স্টোরেজডেভাইস ক্লাস বিস্তৃত বিমূর্ত শ্রেণীর স্টোরেজডেভাইস এবং এফডিডি এবং এইচডিডি ক্লাসগুলির সাথে একই জিনিস করা যেতে পারে। তবে আমরা যদি বিমূর্ত ক্লাস ব্যবহার করি তবে আমরা একাধিক উত্তরাধিকারের সুযোগ নিতে পারি না।
ভ্লাদিমির জর্জিভ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.