একটি মিশ্রণ এবং উত্তরাধিকারের মধ্যে পার্থক্য কী?
উত্তর:
একটি মিশিন সাধারণত একাধিক উত্তরাধিকার হিসাবে ব্যবহৃত হয়। সুতরাং, সেই অর্থে, "কোনও পার্থক্য নেই"।
বিশদটি হ'ল একটি মেশিন স্ট্যান্ডেলোন অবজেক্ট হিসাবে খুব কমই কার্যকর।
উদাহরণস্বরূপ, বলুন যে আপনার কাছে "কালারঅ্যান্ডডাইমেনশন" নামে একটি মিশ্রণ রয়েছে, যা রঙের সম্পত্তি এবং প্রস্থ এবং উচ্চতা যুক্ত করে।
এখন, আপনি একটিতে রঙিনএন্ডডিমেন্স যোগ করতে পারেন, বলুন, শেপ ক্লাস, একটি স্প্রাইট ক্লাস, একটি কার ক্লাস ইত্যাদি। এবং তাদের সবার একই ইন্টারফেস থাকবে (বলুন / সেটকলার বলুন, সেট / হাইট / প্রস্থ ইত্যাদি)
সুতরাং, জেনেরিক ক্ষেত্রে একটি মিশ্রণ আইএস উত্তরাধিকার। তবে আপনি যুক্তি দিতে পারেন যে সামগ্রিক ডোমেনে ক্লাসের ভূমিকার বিষয়টি মিক্সিন একটি "প্রাথমিক" শ্রেণি বা কেবল একটি মিশ্রণ কিনা।
সম্পাদনা করুন - কেবল স্পষ্ট করার জন্য।
হ্যাঁ, একটি মিশিনকে বিবেচনা করা যেতে পারে, আজকের আধুনিক লিঙ্গোতে, একটি সম্পর্কিত ইমপ্লিমেন্টেশন সহ একটি ইন্টারফেস। এটি সত্যই সরল, পুরাতন, প্রতিদিনের একাধিক উত্তরাধিকার একটি সাধারণ, পুরানো, প্রতিদিনের ক্লাস ব্যবহার করে। এটি এমআই এর নির্দিষ্ট অ্যাপ্লিকেশন হতে পারে। বেশিরভাগ ভাষা মিক্সিনকে কোনও বিশেষ মর্যাদা দেয় না; এটি কেবলমাত্র একটি শ্রেণি যা ব্যবহৃত স্ট্যান্ডেলোনের চেয়ে "মিশ্রিত" হওয়ার জন্য ডিজাইন করা হয়েছিল।
একটি মিশ্রণ এবং উত্তরাধিকারের মধ্যে পার্থক্য কী?
একটি মিশ্রণ একটি বেস ক্লাস যা আপনি উত্তরাধিকারী হিসাবে অতিরিক্ত কার্যকারিতা সরবরাহ করতে পারেন। সিউডোকোড উদাহরণ:
class Mixin:
def complex_method(self):
return complex_functionality(self)
"মিক্স-ইন" নামটি ইঙ্গিত করে যে এটি অন্য কোডের সাথে মিশ্রিত করা। যেমন, অনুমানটি হ'ল আপনি নিজেরাই মিক্স-ইন ক্লাসটি ইনস্ট্যান্ট করবেন না। নিম্নলিখিত অবজেক্টটির কোনও ডেটা নেই এবং জটিল_সাম্পকে কল করার জন্য এটি তাত্ক্ষণিকভাবে বোঝা যায় না makes (আপনি সেই ক্ষেত্রে ক্লাসের পরিবর্তে কেবল কোনও ফাংশন সংজ্ঞায়িত করতে পারেন))
>>> obj = Mixin()
অন্যান্য বেস ক্লাসগুলির সাথে প্রায়শই মিক্স-ইন ব্যবহার করা হয়।
অতএব মিশ্রণগুলি উত্তরাধিকারের একটি উপসেট বা বিশেষ ক্ষেত্রে।
একক উত্তরাধিকারের উপর মিক্স-ইন ব্যবহার করার সুবিধাগুলি হ'ল আপনি একবারে কার্যকারিতার জন্য কোড লিখতে পারেন এবং তারপরে একই কার্যকারিতাটি একাধিক বিভিন্ন শ্রেণিতে ব্যবহার করতে পারেন। অসুবিধাটি হ'ল এটির ব্যবহারকারীর চেয়ে অন্যান্য স্থানে আপনার সেই কার্যকারিতাটি সন্ধান করার প্রয়োজন হতে পারে, সুতরাং সেই অসুবিধাকে কাছে রেখেই এটি প্রশমিত করা ভাল।
আমি ব্যক্তিগতভাবে একক উত্তরাধিকারের জন্য প্রয়োজনীয় মিশ্রণটি পেয়েছি যেখানে আমরা প্রচুর অনুরূপ কোড একত্রিত করছি, তবে পরীক্ষার কেসগুলি তাদের বেস কেসের উত্তরাধিকারের ভিত্তিতে ইনস্ট্যান্ট করা হয় এবং কোডটি কাছে রাখার একমাত্র উপায় হ্যান্ড (এবং একই মডিউলে) কভারেজ সংখ্যার সাথে গোলযোগ না করে অবজেক্ট থেকে উত্তরাধিকারী হওয়া এবং সন্তানের কেসগুলি সর্বজনীন টেস্ট-কেস বেস এবং কেবলমাত্র তাদের ক্ষেত্রে প্রযোজ্য কাস্টম বেস উভয়েরই উত্তরাধিকার সূত্রে প্রাপ্ত হয়।
উভয়ই অভিভাবক শ্রেণীর এমন একটি রূপ যা তাত্ক্ষণিকভাবে চালানোর উদ্দেশ্যে নয়।
একটি মিশ্রণ কার্যকারিতা সরবরাহ করে তবে সরাসরি এটি ব্যবহার করতে অক্ষম। একজন ব্যবহারকারী এটি (উপ) শ্রেণীর মাধ্যমে ব্যবহার করার উদ্দেশ্যে।
একটি বিমূর্ত বেস শ্রেণি একটি ইন্টারফেস সরবরাহ করে, তবে ব্যবহারযোগ্য কার্যকারিতা ছাড়াই। কোনও ব্যবহারকারী ইন্টারফেস দ্বারা ডাকা কার্যকারিতা তৈরি করার উদ্দেশ্যে intended
class Abstraction(metaclass=abc.ABCMeta):
@abc.abstractmethod
def complex_method(self):
return complex_functionality(self)
এখানে আপনি এই বিষয়টিকে তাত্ক্ষণিকভাবে আটকাতে বাধা পেয়েছেন কারণ এটি একটি কংক্রিট পদ্ধতিতে কার্যকারিতা বাস্তবায়নের জন্য একটি সাবক্লাস প্রয়োজন (যদিও আপনি এর মধ্যে কার্যকারিতা অ্যাক্সেস করতে পারতেন super()
):
>>> obj = Abstraction()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Can't instantiate abstract class Abstraction with
abstract methods complex_method
পাইথনে, abc
মডিউলের কয়েকটি ক্লাস হ'ল প্যারেন্ট ক্লাসের উদাহরণ যা উভয়ই উত্তরাধিকার এবং বিমূর্ত ইন্টারফেসের মাধ্যমে কার্যকারিতা সরবরাহ করে যা অবশ্যই সাবক্লাসের দ্বারা প্রয়োগ করা উচিত। এই ধারণাগুলি পারস্পরিক একচেটিয়া নয়।
সহজ কথায় বলতে গেলে, একটি মিশ্রণ হ'ল একটি বেস ক্লাস যা আপনি নিজেরাই ইনস্ট্যান্ট করবেন না এবং সাধারণত একাধিক উত্তরাধিকারে মাধ্যমিক বেস শ্রেণি হিসাবে ব্যবহৃত হয়।
মিশ্র-ইন বাস্তবায়নের উদ্দেশ্যে ব্যবহৃত (একাধিক) উত্তরাধিকারের নির্দিষ্ট, সীমাবদ্ধ কেস; কিছু ভাষা (যেমন রুবি) সাধারণীকৃত একাধিক উত্তরাধিকারকে সমর্থন না করে এটি সমর্থন করে।
মিক্সিন একটি বিমূর্ত ধারণা এবং যে কোনও কিছু তার প্রয়োজন মেটাতে মিশ্রণ হিসাবে বিবেচিত হতে পারে।
এখানে উইকিপিডিয়া থেকে একটি সংজ্ঞা দেওয়া আছে।
অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং ল্যাঙ্গুয়েজে মিক্সিন এমন একটি বর্গ যা অন্য শ্রেণীর দ্বারা অভিভাবক শ্রেণি না হয়ে অন্য শ্রেণীর দ্বারা ব্যবহারের জন্য পদ্ধতি রয়েছে। এই অন্যান্য শ্রেণিগুলি কীভাবে মিশ্রণের পদ্ধতিগুলিতে অ্যাক্সেস অর্জন করে তা ভাষার উপর নির্ভর করে। মিক্সিনগুলি কখনও কখনও "উত্তরাধিকারসূত্রে প্রাপ্ত" পরিবর্তে "অন্তর্ভুক্ত" হিসাবে বর্ণনা করা হয়।
সংক্ষেপে, একটি উত্তরাধিকার থেকে মূল পার্থক্য হ'ল মিক্স-ইনগুলির উত্তরাধিকারের মতো "ইস-এ" সম্পর্ক থাকা দরকার না।
বাস্তবায়ন দৃষ্টিকোণ থেকে, আপনি এটি বাস্তবায়নের সাথে ইন্টারফেস হিসাবে ভাবতে পারেন। উদাহরণস্বরূপ, জাভার এক বিমূর্ত শ্রেণি একটি মিশিন হিসাবে বিবেচিত হতে পারে যদি জাভা একাধিক উত্তরাধিকার সমর্থন করে।
"একটি মিক্সিন হ'ল এই ক্লাসের একটি টুকরো যে এটি অন্য শ্রেণি বা মিক্সিনগুলির সাথে তৈরির উদ্দেশ্যে।" -ডিডিজে
একটি মিশিন একটি শ্রেণি বা কোড খণ্ড যা একা একা ব্যবহারের জন্য নয়, পরিবর্তে আপনি এটি অন্য শ্রেণীর অভ্যন্তরে ব্যবহার করার কথা। হয় এটিকে সদস্য ক্ষেত্র / ভেরিয়েবল বা কোড বিভাগ হিসাবে রচনা করা। আমি পরে সবচেয়ে এক্সপোজার আছে। এটি কপি-পেস্টিং বয়লারপ্লেট কোডের চেয়ে কিছুটা ভাল।
এখানে একটি দুর্দান্ত ডিডিজে নিবন্ধ রয়েছে যা বিষয়টির সাথে পরিচয় করিয়ে দেয়।
হাফ-লাইফ 2 / "উত্স" এসডিকে সি ++ মিক্সিনগুলির দুর্দান্ত উদাহরণ। সেই পরিবেশে ম্যাক্রোগুলি কোডের বিশাল আকারের ব্লকগুলি সংজ্ঞায়িত করে যা শ্রেণিকে একটি নির্দিষ্ট "স্বাদ" বা বৈশিষ্ট্য যুক্ত করতে যোগ করা যায়।
উত্স উইকির উদাহরণটি দেখুন: একটি লজিকাল সত্তা রচনা করা । উদাহরণ কোডে DECLARE_CLASS ম্যাক্রো একটি মিশ্রণ হিসাবে বিবেচনা করা যেতে পারে। উত্স SDK ডেটা-অ্যাক্সেস কোডকে মানক করার জন্য এবং সত্তাগুলির আচরণের স্বীকৃতি দিতে ব্যাপকভাবে মিক্সিন ব্যবহার করে।
একাধিক উত্তরাধিকার সহ, নতুন ক্লাসটি একাধিক সুপারক্লাস থেকে তৈরি হতে পারে। আপনি যে কোনও সুপারক্লাসে সংজ্ঞায়িত কেবল পদ্ধতিগুলিতে কল করতে পারেন।
অন্যদিকে, মিক্সিন একটি বিমূর্ত সাবক্লাস যা বিভিন্ন পিতা-মাতার ক্লাসের beversion বিশেষজ্ঞ করতে ব্যবহৃত হতে পারে। মিক্সিনগুলি কোনও পদ্ধতিকে কল করতে পারে (উদাহরণস্বরূপ sayHello(): String
) যদিও তারা এ জাতীয় পদ্ধতির সংজ্ঞা দেয় না।
mixin M {
name: String
defmethod greetings() { print sayHello() + " " + name}
}
আপনি দেখতে পাচ্ছেন, sayHello()
এটি কোথাও সংজ্ঞায়িত না হলেও আপনি কল করতে পারবেন । আপনি mixin যুক্ত করে থাকেন M
ক্লাসে C
, C
প্রদান করা উচিত sayHello()
পদ্ধতি।
আমি মনে করি এটি গুরুত্বপূর্ণ মনে হয়, যে মিশ্রণ উত্তরাধিকার বোঝায় না । উইকিপিডিয়া অনুসারে, একটি মিক্সিন হ'ল:
অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং ল্যাঙ্গুয়েজে মিক্সিন এমন একটি বর্গ যা অন্য শ্রেণীর দ্বারা অভিভাবক শ্রেণি না হয়ে অন্য শ্রেণীর দ্বারা ব্যবহারের জন্য পদ্ধতি রয়েছে। এই অন্যান্য শ্রেণিগুলি কীভাবে মিশ্রণের পদ্ধতিগুলিতে অ্যাক্সেস অর্জন করে তা ভাষার উপর নির্ভর করে। মিক্সিনগুলি কখনও কখনও "উত্তরাধিকারসূত্রে প্রাপ্ত" পরিবর্তে "অন্তর্ভুক্ত" হিসাবে বর্ণনা করা হয়।
বিশেষত পার্ল জাতীয় ভাষায় এক্সপোর্টার মডিউল ব্যবহার করে মিক্সিন যোগ করা যায়:
package Mixins;
use Exporter qw(import);
our @EXPORT_OK = qw(pity);
# assumes it will be mixed-in to a class with a _who_do_i_pity method
sub pity {
my ($self) = @_;
printf("I pity %s\n", $self->_who_do_i_pity('da foo'));
}
যা এক সাথে একাধিক পদ্ধতি বা গুলি যুক্ত কোনও মডিউলে মিশ্রিত হতে পারে:
package MrT
use Mixins qw(pity);
sub new {
return bless({}, shift);
}
sub _who_do_i_pity {
return 'da foo!'
}
তারপরে আপনার MrT
মডিউলটিতে এভাবে ব্যবহার করা যেতে পারে:
use MrT;
MrT->new()->pity();
আমি এর একটি অযৌক্তিক উদাহরণ জানি, কিন্তু, এটি পয়েন্টটি পেয়ে যায় ...
মিক্সিনগুলি আরও "প্লাগইন" এর মতো পদ্ধতিতে ব্যাপকভাবে ব্যবহৃত হয়।
তারা একই কিন্তু তাদের প্রতিটি প্রত্যেকে আলাদা প্রসঙ্গে। সাধারণত যখন আমরা উত্তরাধিকারের বিষয়ে কথা বলি আমরা একক উত্তরাধিকারের বিষয়ে কথা বলি এবং একটি মিশ্রণ এমন এক নির্মাণ যা বহু উত্তরাধিকারের অনুমতি দেয় allows
এটি এমন একটি ভাষা নির্মাণ যা ওওপি বিশ্বে খুব বিতর্কিত কারণ:
তবে সেটিকে বাদ দিয়ে একটি শক্তিশালী কনস্ট্রাক্ট যা বিভিন্ন ভাষা ও ফ্রেমওয়ার্কে ব্যবহৃত হয়, এর কয়েকটি উদাহরণ হ'ল: