পরিভাষা: আমি ভাষাটি ইন্টারফেসinterface
হিসাবে কনস্ট্রাক্ট , এবং কোনও ধরণের বা বস্তুর ইন্টারফেসকে পৃষ্ঠ হিসাবে (আরও ভাল শব্দটির অভাবে) উল্লেখ করব।
কোনও বস্তু কংক্রিটের পরিবর্তে কোনও বিমূর্ততার উপর নির্ভর করে আলগা মিলন অর্জন করা যায়।
সঠিক।
এটি দুটি মূল কারণের জন্য আলগা সংযোগের অনুমতি দেয়: 1 - অ্যাবস্ট্রাকশনগুলি কংক্রিটের ধরণের চেয়ে পরিবর্তনের সম্ভাবনা কম থাকে যার অর্থ নির্ভরশীল কোডটি ভাঙ্গার সম্ভাবনা কম। 2 - রানটাইমের সময় বিভিন্ন কংক্রিটের ধরণের ব্যবহার করা যেতে পারে, কারণ এগুলি সমস্ত বিমূর্ততার জন্য ফিট করে। বিদ্যমান নির্ভর কোডটি পরিবর্তন করার প্রয়োজন নেই বলে নতুন কংক্রিট প্রকারগুলি পরে যুক্ত করা যেতে পারে।
একদম সঠিক নয়। বর্তমান ভাষা সাধারণত প্রত্যাশা করে না যে বিমূর্ততা পরিবর্তিত হবে (যদিও এটি হ্যান্ডেল করার জন্য কিছু নকশার ধরণ রয়েছে)। সাধারণ বিষয় থেকে বিশদ আলাদা করা বিমূর্ততা। এটি সাধারণত বিমূর্ততার কিছু স্তর দ্বারা করা হয় । এই স্তরটি কোডটি না ভেঙে কিছু অন্যান্য নির্দিষ্টকরণে পরিবর্তন করা যেতে পারে যা এই বিমূর্তির উপর ভিত্তি করে - আলগা সংযোগ অর্জন করে। অ-ওওপি উদাহরণ: একটি sort
রুটিনটি কুইকসোর্ট থেকে সংস্করণ ১-এ টিম সাজ্টরে সংস্করণ ২-এ পরিবর্তিত হতে পারে কোডটি যা কেবল বাছাই করা ফলাফলের উপর নির্ভর করে (যেমন sort
বিমূর্তির উপর ভিত্তি করে ) তাই প্রকৃত বাছাইকরণ বাস্তবায়ন থেকে ডিকপলড হয়।
আমি উপরের পৃষ্ঠটিকে যা বলেছি তা হ'ল বিমূর্তনের সাধারণ অংশ । এটি এখন ওওপি-তে ঘটেছিল যে কোনও একটি বস্তুর মাঝে মাঝে একাধিক বিমূর্তি সমর্থন করতে হবে। একটি খুব অনুকূল উদাহরণ: জাভা java.util.LinkedList
উভয় সমর্থন করেList
ইন্টারফেসকে যা "অর্ডার করা, সূচকযোগ্য সংগ্রহ" বিমূর্ততা সম্পর্কে এবং Queue
ইন্টারফেসটিকে সমর্থন করে যা (মোটামুটি ভাষায়) "ফিফো" বিমূর্ততা সম্পর্কে about
কীভাবে কোনও বস্তু একাধিক বিমূর্তি সমর্থন করতে পারে?
সি ++ এর ইন্টারফেস নেই, তবে এতে একাধিক উত্তরাধিকার, ভার্চুয়াল পদ্ধতি এবং বিমূর্ত শ্রেণি রয়েছে। তারপরে একটি বিমূর্ততাটিকে একটি বিমূর্ত শ্রেণি হিসাবে সংজ্ঞায়িত করা যেতে পারে (অর্থাত্ এমন একটি শ্রেণি যা অবিলম্বে তাত্ক্ষণিকভাবে চালু করা যায় না) যা ঘোষণা করে তবে ভার্চুয়াল পদ্ধতিগুলি সংজ্ঞায়িত করে না। ক্লাসগুলি যা বিমূর্তির সুনির্দিষ্ট বৈশিষ্ট্যগুলি কার্যকর করে তারপরে সেই বিমূর্ত শ্রেণীর উত্তরাধিকারী হতে পারে এবং প্রয়োজনীয় ভার্চুয়াল পদ্ধতিগুলি প্রয়োগ করতে পারে।
এখানে সমস্যাটি হ'ল একাধিক উত্তরাধিকার হীরা সমস্যা তৈরি করতে পারে , যেখানে কোনও পদ্ধতি প্রয়োগের জন্য ক্লাসগুলি অনুসন্ধান করা হয় তার ক্রম (এমআরও: পদ্ধতি সমাধানের আদেশ) "বৈপরীত্য" হতে পারে। এটির জন্য দুটি প্রতিক্রিয়া রয়েছে:
একটি বুদ্ধিমান অর্ডার সংজ্ঞায়িত করুন এবং সেই অর্ডারগুলি প্রত্যাখ্যান করুন যা সংবেদনশীলভাবে রৈখিক হতে পারে না। C3 এ ম্রো মোটামুটি যুক্তিসম্মত এবং ভাল কাজ করে। এটি 1996 প্রকাশিত হয়েছিল।
সহজ রুটটি ধরুন এবং জুড়ে একাধিক উত্তরাধিকার প্রত্যাখ্যান করুন।
জাভা পরবর্তী বিকল্পটি গ্রহণ করেছে এবং একক আচরণের উত্তরাধিকার বেছে নিয়েছে। তবে একাধিক বিমূর্ততা সমর্থন করার জন্য আমাদের এখনও কোনও অবজেক্টের দক্ষতা প্রয়োজন। সুতরাং, ইন্টারফেসগুলি ব্যবহার করতে হবে যা পদ্ধতির সংজ্ঞাগুলি সমর্থন করে না, কেবলমাত্র ঘোষণাগুলি।
ফলাফলটি হ'ল এমআরও সুস্পষ্ট (কেবলমাত্র প্রতিটি সুপারক্লাসকে ক্রমে দেখুন) এবং আমাদের অবজেক্টের যে কোনও সংখ্যক বিমূর্ততার জন্য একাধিক পৃষ্ঠ থাকতে পারে।
এটি বরং অসন্তুষ্ট হতে দেখা যায়, কারণ প্রায়শই বেশিরভাগ আচরণ পৃষ্ঠের অংশ হিসাবে থাকে। একটি Comparable
ইন্টারফেস বিবেচনা করুন:
interface Comparable<T> {
public int cmp(T that);
public boolean lt(T that); // less than
public boolean le(T that); // less than or equal
public boolean eq(T that); // equal
public boolean ne(T that); // not equal
public boolean ge(T that); // greater than or equal
public boolean gt(T that); // greater than
}
এটি অত্যন্ত ব্যবহারকারী-বান্ধব (অনেক সুবিধাজনক পদ্ধতির একটি দুর্দান্ত এপিআই) তবে বাস্তবায়নের জন্য ক্লান্তিকর। আমরা ইন্টারফেসটি কেবলমাত্র cmp
একটি প্রয়োজনীয় পদ্ধতির সাথে যুক্ত করে অন্য পদ্ধতিগুলি স্বয়ংক্রিয়ভাবে প্রয়োগ করতে চাই । মিক্সিনস , তবে আরও গুরুত্বপূর্ণভাবে বৈশিষ্ট্যগুলি [ 1 ], [ 2 ] একাধিক উত্তরাধিকারের ফাঁদে না পড়েই এই সমস্যাটি সমাধান করে।
এটি একটি বৈশিষ্ট্য রচনাটি সংজ্ঞায়িত করার মাধ্যমে করা হয় যাতে বৈশিষ্টগুলি এমআরওতে অংশ নিতে না পারে - পরিবর্তে সংজ্ঞায়িত পদ্ধতিগুলি বাস্তবায়নকারী শ্রেণিতে গঠিত হয়।
Comparable
ইন্টারফেস হিসাবে Scala প্রকাশ করা যেতে পারে
trait Comparable[T] {
def cmp(that: T): Int
def lt(that: T): Boolean = this.cmp(that) < 0
def le(that: T): Boolean = this.cmp(that) <= 0
...
}
কোনও শ্রেণি তখন সেই বৈশিষ্ট্য ব্যবহার করে, অন্যান্য পদ্ধতিগুলি শ্রেণীর সংজ্ঞাতে যুক্ত হয়:
// "extends" isn't different from Java's "implements" in this case
case class Inty(val x: Int) extends Comparable[Inty] {
override def cmp(that: Inty) = this.x - that.x
// lt etc. get added automatically
}
তাই Inty(4) cmp Inty(6)
হবে -2
এবং Inty(4) lt Inty(6)
হবে true
।
অনেক ভাষার বৈশিষ্ট্যের জন্য কিছুটা সমর্থন থাকে এবং যে কোনও ভাষার "মেটাওজেক্ট প্রোটোকল (এমওপি)" থাকে তাতে এর বৈশিষ্ট্য যুক্ত থাকতে পারে। সাম্প্রতিক জাভা 8 আপডেট যুক্ত বৈশিষ্ট্যগুলির অনুরূপ ডিফল্ট পদ্ধতিগুলি (ইন্টারফেসের পদ্ধতিগুলিতে ফলব্যাক বাস্তবায়ন থাকতে পারে যাতে এই পদ্ধতিগুলি বাস্তবায়নের জন্য শ্রেণি বাস্তবায়নের ক্ষেত্রে এটি বিকল্প)।
দুর্ভাগ্যক্রমে, বৈশিষ্ট্যগুলি মোটামুটি সাম্প্রতিক আবিষ্কার (2002) এবং এগুলি বৃহত্তর মূলধারার ভাষাগুলিতে মোটামুটি বিরল।