জাভা একাধিক উত্তরাধিকারের অনুমতি দেয় না, তবে এটি একাধিক ইন্টারফেস প্রয়োগ করতে দেয়। কেন?
জাভা একাধিক উত্তরাধিকারের অনুমতি দেয় না, তবে এটি একাধিক ইন্টারফেস প্রয়োগ করতে দেয়। কেন?
উত্তর:
ইন্টারফেসগুলি শুধুমাত্র নির্দিষ্ট কারণ কি বর্গ করছে না কিভাবে এটা করছে।
একাধিক উত্তরাধিকারের সমস্যাটি হ'ল দুটি শ্রেণি একই জিনিস করার বিভিন্ন পদ্ধতি নির্ধারণ করতে পারে এবং সাবক্লাসটি কোনটি বেছে নেবে তা চয়ন করতে পারে না।
আমার কলেজের একজন প্রশিক্ষক আমাকে এভাবে ব্যাখ্যা করেছেন:
ধরুন আমার একটি ক্লাস আছে, যা টোস্টার, এবং অন্য ক্লাস, যা নিউক্লিয়ারবম্ব। তাদের উভয়ের একটি "অন্ধকার" সেটিংস থাকতে পারে। তাদের উভয়ের একটি অন () পদ্ধতি রয়েছে। (একটিতে একটি অফ () রয়েছে, অন্যটির নেই)) যদি আমি এমন একটি ক্লাস তৈরি করতে চাই যা এই দুটিরই একটি সাবক্লাস ... আপনি দেখতে পাচ্ছেন, এটি এমন একটি সমস্যা যা আমার মুখের সামনে সত্যিই ফুঁসে উঠতে পারে is ।
সুতরাং প্রধান বিষয়গুলির মধ্যে একটি হ'ল যদি আপনার দুটি অভিভাবক শ্রেণি থাকে তবে তাদের একই বৈশিষ্ট্যের বিভিন্ন বাস্তবায়ন থাকতে পারে - বা সম্ভবত একই নামের দুটি পৃথক বৈশিষ্ট্য আমার প্রশিক্ষকের উদাহরণ হিসাবে in তারপরে আপনার সাবক্লাসটি কোনটি ব্যবহার করছে তা সিদ্ধান্ত নেওয়ার জন্য আপনাকে মোকাবেলা করতে হবে। এটি পরিচালনা করার উপায়গুলি অবশ্যই রয়েছে - সি ++ এটি করে - তবে জাভার ডিজাইনাররা অনুভব করেছিলেন যে এটি জিনিসগুলিকে আরও জটিল করে তুলবে।
একটি ইন্টারফেসের সাহায্যে, আপনি অন্য শ্রেণীর কিছু করার পদ্ধতি methodণ দেওয়ার চেয়ে শ্রেণি এমন কিছু করতে সক্ষম যা কিছু বর্ণনা করছেন। একাধিক ইন্টারফেসের কারণে এমন একাধারে জটিল দ্বন্দ্ব হওয়ার সম্ভাবনা কম যা একাধিক অভিভাবক শ্রেণীর চেয়ে সমাধান করা দরকার।
কারণ "হেই, এই পদ্ধতিটি দরকারী মনে হচ্ছে না, এমনকি উত্তরাধিকারকে অতিরিক্ত ব্যবহার করা হয়েছে , আমি সেই শ্রেণিটিও প্রসারিত করব"।
public class MyGodClass extends AppDomainObject, HttpServlet, MouseAdapter,
AbstractTableModel, AbstractListModel, AbstractList, AbstractMap, ...
এই প্রশ্নের উত্তরটি জাভা সংকলক (কনস্ট্রাক্টর চেইনিং) এর অভ্যন্তরীণ কাজের মধ্যে রয়েছে। যদি আমরা জাভা সংকলকের অভ্যন্তরীণ কাজ দেখতে পাই:
public class Bank {
public void printBankBalance(){
System.out.println("10k");
}
}
class SBI extends Bank{
public void printBankBalance(){
System.out.println("20k");
}
}
এই চেহারাটি সংকলন করার পরে:
public class Bank {
public Bank(){
super();
}
public void printBankBalance(){
System.out.println("10k");
}
}
class SBI extends Bank {
SBI(){
super();
}
public void printBankBalance(){
System.out.println("20k");
}
}
যখন আমরা শ্রেণি প্রসারিত করি এবং এটির একটি অবজেক্ট তৈরি করি, তখন একটি নির্মাতা চেইন Object
ক্লাস অবধি চলবে ।
উপরে কোড জরিমানা চলবে। তবে আমাদের যদি আরও একটি ক্লাস বলা হয় Car
যা প্রসারিত হয় Bank
এবং একটি হাইব্রিড (একাধিক উত্তরাধিকার) শ্রেণি বলা হয় SBICar
:
class Car extends Bank {
Car() {
super();
}
public void run(){
System.out.println("99Km/h");
}
}
class SBICar extends Bank, Car {
SBICar() {
super(); //NOTE: compile time ambiguity.
}
public void run() {
System.out.println("99Km/h");
}
public void printBankBalance(){
System.out.println("20k");
}
}
এক্ষেত্রে (এসবিআইসিআর) কনস্ট্রাক্টর চেইন তৈরি করতে ব্যর্থ হবে ( সময়ের অস্পষ্টতা সংকলন )।
ইন্টারফেসের জন্য এটি অনুমোদিত কারণ আমরা এটির কোনও বস্তু তৈরি করতে পারি না।
নতুন ধারণা default
এবং static
পদ্ধতির জন্য দয়া করে ইন্টারফেসে ডিফল্ট উল্লেখ করুন ।
আশা করি এটি আপনার প্রশ্নের সমাধান করবে। ধন্যবাদ।
একাধিক ইন্টারফেস প্রয়োগ করা খুব দরকারী এবং ভাষা প্রয়োগকারী বা প্রোগ্রামারদের খুব বেশি সমস্যা সৃষ্টি করে না। সুতরাং এটি অনুমোদিত। একাধিক উত্তরাধিকার দরকারী হিসাবে, ব্যবহারকারীদের গুরুতর সমস্যা সৃষ্টি করতে পারে ( মৃত্যুর ভয়ঙ্কর হীরা )। এবং আপনি একাধিক উত্তরাধিকারের সাথে সর্বাধিক কাজগুলি রচনা বা অভ্যন্তরীণ ক্লাসগুলি ব্যবহার করেও করতে পারেন। সুতরাং লাভের চেয়ে বেশি সমস্যা আনতে একাধিক উত্তরাধিকার নিষিদ্ধ।
ToyotaCar
এবং HybridCar
উভয়ই উদ্ভূত হয় Car
এবং ওভাররড হয় Car.Drive
এবং যদি PriusCar
উভয়ই উত্তরাধিকার সূত্রে প্রাপ্ত হয় তবে ওভাররাইড না হয়Drive
তবে ভার্চুয়ালটি কী করা Car.Drive
উচিত তা চিহ্নিত করার সিস্টেমটির কোনও উপায় থাকবে না। ইন্টারফেসগুলি উপরের ইতরুক্ত অবস্থা এড়িয়ে এই সমস্যাটি এড়ায়।
void UseCar(Car &foo)
; দ্ব্যর্থতা নিরসন মধ্যে অন্তর্ভুক্ত করা আশা করা যায় না ToyotaCar::Drive
এবং HybridCar::Drive
(যে যারা অন্যান্য ধরনের এমনকি যেহেতু এটি প্রায়ই তন্ন তন্ন জানা উচিত কিংবা যত্ন অস্তিত্ব )। সি ++ এর মতো একটি ভাষার জন্য কোডটি ToyotaCar &myCar
পাস করার ইচ্ছের সাথে UseCar
অবশ্যই কোডটি প্রথমে হয় হয় HybridCar
বা হয় ToyotaCar
, তবে ((কার) (হাইব্রিডকার) মাইকার) থাকতে ((Car)(ToyotaCar)myCar).Drive
হবে `ড্রাইভ এবং বিভিন্ন কাজ করতে পারে, যা বোঝায় যে আপকাস্টগুলি পরিচয়-সংরক্ষণ ছিল না।
আপনি একাধিক উত্তরাধিকার সম্পর্কে ওরাকল ডকুমেন্টেশন পৃষ্ঠায় এই প্রশ্নের জন্য সঠিক উত্তর পেতে পারেন
একাধিক রাষ্ট্রের উত্তরাধিকার: একাধিক শ্রেণী থেকে ক্ষেত্র উত্তরাধিকারী হওয়ার ক্ষমতা
জাভা প্রোগ্রামিং ল্যাঙ্গুয়েজ আপনাকে একাধিক শ্রেণি বাড়ানোর অনুমতি না দেওয়ার একটি কারণ হ'ল রাষ্ট্রের একাধিক উত্তরাধিকারের সমস্যাগুলি এড়ানো, যা একাধিক শ্রেণী থেকে ক্ষেত্রের উত্তরাধিকারী হওয়ার ক্ষমতা
যদি একাধিক উত্তরাধিকার অনুমোদিত হয় এবং আপনি যখন এই শ্রেণিটি ইনস্ট্যান্ট করে কোনও অবজেক্ট তৈরি করেন, সেই বস্তু শ্রেণীর সমস্ত সুপারক্লাসের ক্ষেত্রগুলি উত্তরাধিকার সূত্রে প্রাপ্ত হবে। এটি দুটি ইস্যু সৃষ্টি করবে।
বাস্তবায়নের একাধিক উত্তরাধিকার: একাধিক শ্রেণি থেকে পদ্ধতি সংজ্ঞা উত্তরাধিকারী হওয়ার ক্ষমতা
এই পদ্ধতির সাথে সমস্যাগুলি: নাম বিবাদ ts এবং অস্পষ্টতা । যদি একটি সাবক্লাস এবং সুপারক্লাসে একই পদ্ধতির নাম (এবং স্বাক্ষর) থাকে তবে সংকলক কোন সংস্করণটি প্রার্থনা করবে তা নির্ধারণ করতে পারে না।
তবে জাভা এই ধরণের একাধিক উত্তরাধিকারকে ডিফল্ট পদ্ধতিগুলির সাথে সমর্থন করে , যা জাভা 8 প্রকাশের পর থেকে চালু হয়েছিল। নির্দিষ্ট শ্রেণীর কোন ডিফল্ট পদ্ধতি ব্যবহার করে তা নির্ধারণ করতে জাভা সংকলক কিছু নিয়ম সরবরাহ করে।
হীরা সমস্যা সমাধানের বিষয়ে আরও তথ্যের জন্য এসই পোস্টের নীচে দেখুন:
জাভা 8-এ অ্যাবস্ট্রাক্ট ক্লাস এবং ইন্টারফেসের মধ্যে পার্থক্য কী?
একাধিক প্রকারের উত্তরাধিকার: একাধিক ইন্টারফেস প্রয়োগের শ্রেণীর সক্ষমতা।
ইন্টারফেসে যেহেতু পারস্পরিক পরিবর্তনযোগ্য ক্ষেত্র নেই, তাই আপনাকে এখানে একাধিক রাষ্ট্রের উত্তরাধিকার থেকে প্রাপ্ত সমস্যাগুলির বিষয়ে চিন্তা করতে হবে না।
বলা হয়ে থাকে যে অবজেক্টস স্টেটটিকে ক্ষেত্রগুলির ক্ষেত্রে শ্রদ্ধার সাথে উল্লেখ করা হয় এবং যদি অনেক শ্রেণি উত্তরাধিকার সূত্রে প্রাপ্ত হয় তবে এটি অস্পষ্ট হয়ে উঠবে। লিঙ্কটি এখানে
http://docs.oracle.com/javase/tutorial/java/IandI/multipleinheritance.html
জাভা কেবল ইন্টারফেসের মাধ্যমে একাধিক উত্তরাধিকার সমর্থন করে। একটি শ্রেণি যে কোনও সংখ্যক ইন্টারফেস বাস্তবায়ন করতে পারে তবে কেবল একটি শ্রেণি প্রসারিত করতে পারে।
একাধিক উত্তরাধিকার সমর্থিত নয় কারণ এটি মারাত্মক হীরা সমস্যার দিকে পরিচালিত করে। তবে এটি সমাধান করা যেতে পারে তবে এটি জটিল ব্যবস্থায় নিয়ে যায় তাই একাধিক উত্তরাধিকার জাভা প্রতিষ্ঠাতারা বাদ দিয়েছেন।
ফেব্রুয়ারী 1995 সালে জেমস গোসলিংয়ের "জাভা: একটি ওভারভিউ" শিরোনামে একটি সাদা কাগজে ( লিঙ্ক ) জাভাতে কেন একাধিক উত্তরাধিকার সমর্থন করা যায় না সে সম্পর্কে ধারণা দেয়।
গোসলিংয়ের মতে:
"জাভা C ++ এর অনেক কম ব্যবহার করা, দুর্বল বোঝা, বিভ্রান্তিকর বৈশিষ্ট্য বাদ দেয় যা আমাদের অভিজ্ঞতায় আরও বেশি দুঃখ নিয়ে আসে। T এর চেয়ে বেশি This এটি মূলত অপারেটর ওভারলোডিং (যদিও এতে পদ্ধতি ওভারলোডিং রয়েছে), একাধিক উত্তরাধিকার এবং বিস্তৃত স্বয়ংক্রিয় জবরদস্তি নিয়ে গঠিত।"
একই কারণে সি # একাধিক উত্তরাধিকারের অনুমতি দেয় না তবে আপনাকে একাধিক ইন্টারফেস প্রয়োগ করতে দেয়।
সি ++ ডাব্লু / একাধিক উত্তরাধিকারের কাছ থেকে যে পাঠটি শিখেছে তা হ'ল এটি মূল্যবান হওয়ার চেয়ে আরও বেশি সমস্যার দিকে পরিচালিত করে।
একটি ইন্টারফেস আপনার ক্লাসে প্রয়োগ করা জিনিসগুলির একটি চুক্তি। আপনি ইন্টারফেস থেকে কোনও কার্যকারিতা অর্জন করবেন না। উত্তরাধিকার আপনাকে অভিভাবক শ্রেণির কার্যকারিতা উত্তরাধিকারী করার অনুমতি দেয় (এবং একাধিক-উত্তরাধিকারে, এটি অত্যন্ত বিভ্রান্তি পেতে পারে)।
একাধিক ইন্টারফেসের অনুমতি দিলে আপনি একাধিক উত্তরাধিকার ব্যবহার করে একই ধরণের সমস্যা সমাধান করতে ডিজাইন প্যাটার্নগুলি (অ্যাডাপ্টারের মতো) ব্যবহার করতে পারবেন তবে আরও নির্ভরযোগ্য এবং অনুমানযোগ্য পদ্ধতিতে।
D1
এবং D2
থেকে উভয় উত্তরাধিকারী B
, এবং প্রতিটি ওভাররাইড একটি ফাংশন f
, এবং যদি obj
একটি টাইপ একটি দৃষ্টান্ত হল S
যা উভয় থেকে উত্তরাধিকারী D1
এবং D2
কিন্তু ওভাররাইড না f
, তারপর একটি রেফারেন্স কাস্ট S
করার D1
কিছু যার উত্পাদ উচিত f
ব্যবহারসমূহ D1
ওভাররাইড, এবং এ কাস্ট B
না করা উচিত যে পরিবর্তন। একইভাবে একটি রেফারেন্স ভোটদান S
থেকে D2
একটা কিছু যার উত্পাদ উচিত f
ব্যবহারসমূহ D2
ওভাররাইড, এবং এ কাস্ট B
যে পরিবর্তন করা উচিত নয়। কোনও ভাষার যদি ভার্চুয়াল সদস্যদের যুক্ত করার অনুমতি না দেওয়া হয় ...
যেহেতু এই বিষয়টি নিকটবর্তী নয় আমি এই উত্তরটি পোস্ট করব, আশা করি এটি কাউকে বুঝতে সাহায্য করবে যে কেন জাভা একাধিক উত্তরাধিকার অনুমতি দেয় না।
নিম্নলিখিত শ্রেণীর বিবেচনা করুন:
public class Abc{
public void doSomething(){
}
}
এক্ষেত্রে ক্লাস অব্যাক কিছুই ঠিক করে না? এত তাড়াতাড়ি নয়, এই শ্রেণীর অন্তর্নিহিত শ্রেণি অবজেক্ট, বেস ক্লাসটি প্রসারিত করে যা জাভাতে সবকিছু কাজ করার অনুমতি দেয়। সবকিছুই একটি বস্তু।
তুমি ক্লাসে ব্যবহার করতে উপরে আপনি দেখতে পাবেন যে আপনার আইডিই আপনার মত পদ্ধতি ব্যবহার করার অনুমতি দেয় চেষ্টা করুন: equals(Object o)
, toString()
, ইত্যাদি, কিন্তু আপনি সেই পদ্ধতি ঘোষণা করা হয়নি, তারা বেস ক্লাস থেকে এসেObject
আপনি চেষ্টা করতে পারেন:
public class Abc extends String{
public void doSomething(){
}
}
এটি ঠিক আছে, কারণ আপনার ক্লাসটি অন্তর্নিহিত নয় Object
তবে প্রসারিত হবে String
কারণ আপনি এটি বলেছিলেন। নিম্নলিখিত পরিবর্তন বিবেচনা করুন:
public class Abc{
public void doSomething(){
}
@Override
public String toString(){
return "hello";
}
}
আপনি যদি স্ট্রিং () এ কল করেন এখন আপনার ক্লাস সর্বদা "হ্যালো" ফেরত আসবে।
এখন নিম্নলিখিত শ্রেণীর কল্পনা করুন:
public class Flyer{
public void makeFly(){
}
}
public class Bird extends Abc, Flyer{
public void doAnotherThing(){
}
}
আবার বর্গ Flyer
অন্তর্নিহিত বস্তুর পন্থা নেই প্রসারিত toString()
, কোন শ্রেণীর তারা সব প্রসারিত যেহেতু এই পদ্ধতি থাকবে Object
পরোক্ষভাবে, তাই, আপনি যদি কল toString()
থেকে Bird
, যা toString()
জাভা ব্যবহার হবে কবে? থেকে Abc
নাকি Flyer
? এটি এমন কোনও শ্রেণীর সাথে ঘটবে যা দুটি বা ততোধিক ক্লাস প্রসারিত করার চেষ্টা করে, এই ধরণের "পদ্ধতির সংঘর্ষ" এড়াতে তারা ইন্টারফেসের ধারণাটি তৈরি করেছিল , মূলত আপনি তাদের এমন একটি বিমূর্ত শ্রেণি হিসাবে ভাবতে পারেন যা অবজেক্টকে পরোক্ষভাবে প্রসারিত করে না । যেহেতু তারা বিমূর্ত, তারা একটি শ্রেণি দ্বারা প্রয়োগ করা হবে, যা একটি বস্তু (আপনি একা কোনও ইন্টারফেস ইনস্ট্যান্স করতে পারবেন না, সেগুলি অবশ্যই একটি শ্রেণীর দ্বারা প্রয়োগ করা উচিত), তাই সবকিছু ঠিকঠাক কাজ চালিয়ে যাবে।
ইন্টারফেস থেকে শ্রেণি আলাদা করতে, কীওয়ার্ড প্রয়োগগুলি কেবল ইন্টারফেসের জন্য সংরক্ষিত ছিল।
আপনি একই শ্রেণিতে পছন্দ মতো যে কোনও ইন্টারফেস বাস্তবায়ন করতে পারেন যেহেতু তারা ডিফল্টরূপে কিছু বাড়ায় না (তবে আপনি এমন ইন্টারফেস তৈরি করতে পারেন যা অন্য ইন্টারফেসকে প্রসারিত করে, তবে আবার "পিতা" ইন্টারফেসটি অবজেক্টকে প্রসারিত করবে না), তাই ইন্টারফেসটি হ'ল কেবল একটি ইন্টারফেস এবং তারা " পদ্ধতিগুলির স্বাক্ষর কলিটিশনগুলি " থেকে ভুগবেন না, তারা যদি সংকলকটি করে তবে এটি আপনাকে একটি সতর্কতা এনে দেবে এবং এটি ঠিক করার জন্য আপনাকে কেবল পদ্ধতি স্বাক্ষর পরিবর্তন করতে হবে (স্বাক্ষর = পদ্ধতির নাম + প্যারাম + রিটার্নের ধরণ) ।
public interface Flyer{
public void makeFly(); // <- method without implementation
}
public class Bird extends Abc implements Flyer{
public void doAnotherThing(){
}
@Override
public void makeFly(){ // <- implementation of Flyer interface
}
// Flyer does not have toString() method or any method from class Object,
// no method signature collision will happen here
}
কারণ একটি ইন্টারফেস কেবল একটি চুক্তি। এবং একটি বর্গ আসলে তথ্য জন্য একটি ধারক হয়।
উদাহরণস্বরূপ দুটি শ্রেণি এ, বি একই পদ্ধতি এম 1 () রয়েছে। এবং ক্লাস সি এ, বি উভয় প্রসারিত করে
class C extends A, B // for explaining purpose.
এখন, ক্লাস সি এম 1 এর সংজ্ঞাটি অনুসন্ধান করবে। প্রথমত, এটি শ্রেণিতে অনুসন্ধান করবে যদি এটি না পাওয়া যায় তবে এটি পিতামাতার ক্লাসে যাচাই করবে। A, B উভয়েরই সংজ্ঞা রয়েছে সুতরাং এখানে অস্পষ্টতা দেখা দেয় কোন সংজ্ঞাটি বেছে নেওয়া উচিত। সুতরাং জাভা মাল্টিপল ইনহরিটি সাপোর্ট করে না।
জাভা দুটি কারণে একাধিক উত্তরাধিকার সমর্থন করে না:
Object
। যখন এটি একাধিক সুপার শ্রেণীর কাছ থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হয়, সাব ক্লাসটি অবজেক্ট শ্রেণির সম্পত্তি অর্জনের অস্পষ্টতা অর্জন করে ..super()
সাপার ক্লাস কনস্ট্রাক্টরকে আহ্বান জানানো হচ্ছে। ক্লাসে একাধিক সুপার ক্লাস থাকলে তা বিভ্রান্ত হয়।সুতরাং যখন একটি শ্রেণি একাধিক সুপার ক্লাস থেকে প্রসারিত হয়, আমরা সংকলন সময় ত্রুটি পাই।
উদাহরণস্বরূপ বিবেচনা করুন, যেখানে ক্লাস এ এর গেটসোমিংথ পদ্ধতি রয়েছে এবং ক্লাস বিতে গেটসোমিংথ পদ্ধতি রয়েছে এবং ক্লাস সি এর বি এবং এ বি বাড়ানো হয়েছে, কেউ যদি সিগেটসোমিংথিং বলে তবে কি হবে? কোন পদ্ধতিটি কল করতে হবে তা নির্ধারণের কোনও উপায় নেই।
ইন্টারফেসগুলি মূলত কেবল একটি প্রয়োগকারী শ্রেণীর কী কী পদ্ধতিতে থাকা দরকার তা নির্দিষ্ট করে। এক শ্রেণি যা একাধিক ইন্টারফেস প্রয়োগ করে কেবল তার অর্থ ক্লাসটি সমস্ত ইন্টারফেস থেকে পদ্ধতিগুলি প্রয়োগ করে। উপরে বর্ণিত অনুসারে হুইসি কোনও সমস্যার দিকে পরিচালিত করবে না।
এমন পরিস্থিতি বিবেচনা করুন যেখানে টেস্ট 1, টেস্ট 2 এবং টেস্ট 3 তিনটি শ্রেণি রয়েছে। টেস্ট 3 শ্রেণি উত্তরাধিকার সূত্রে টেস্ট 2 এবং টেস্ট 1 ক্লাস হয়। টেস্ট 1 এবং টেস্ট 2 ক্লাসগুলির যদি একই পদ্ধতি থাকে এবং আপনি এটি শিশু শ্রেণীর অবজেক্ট থেকে কল করেন তবে টেস্ট 1 বা টেস্ট 2 শ্রেণির পদ্ধতি কল করার ক্ষেত্রে অস্পষ্টতা থাকবে তবে ইন্টারফেসের ক্ষেত্রে এমন কোনও অস্পষ্টতা নেই কারণ ইন্টারফেসে কোনও প্রয়োগ নেই।
অস্পষ্টতা সমস্যার কারণে জাভা একাধিক উত্তরাধিকার, মাল্টিপথ এবং সংকর উত্তরাধিকারকে সমর্থন করে না:
Scenario for multiple inheritance: Let us take class A , class B , class C. class A has alphabet(); method , class B has also alphabet(); method. Now class C extends A, B and we are creating object to the subclass i.e., class C , so C ob = new C(); Then if you want call those methods ob.alphabet(); which class method takes ? is class A method or class B method ? So in the JVM level ambiguity problem occurred. Thus Java does not support multiple inheritance.
রেফারেন্স লিংক: https://plus.google.com/u/0/communities/102217496457095083679
সহজ পদ্ধতিতে আমরা সকলেই জানি, আমরা এক শ্রেণির উত্তরাধিকারী হতে পারি (প্রসারিত) তবে আমরা অনেকগুলি ইন্টারফেস প্রয়োগ করতে পারি .. এটি কারণ ইন্টারফেসগুলিতে আমরা কোনও বাস্তবায়ন দেয় না কেবল কার্যকারিতা বলে। ধরুন জাভা যদি অনেকগুলি ক্লাস প্রসারিত করতে পারে এবং সেগুলির একই পদ্ধতি রয়েছে .. এই বিন্দুতে আমরা যদি সাব ক্লাসে সুপার ক্লাস পদ্ধতিটি চালানোর চেষ্টা করি তবে কোন পদ্ধতিটি চালানোর কথা মনে করুন ??, সংকলক বিভ্রান্ত উদাহরণ পেয়েছেন: - একাধিক প্রসারিত করার চেষ্টা করুন তবে ইন্টারফেসে সেই পদ্ধতিগুলির দেহ নেই আমাদের সাব ক্লাসে প্রয়োগ করা উচিত .. একাধিক প্রয়োগের চেষ্টা করুন যাতে কোনও উদ্বেগ নেই ..
* আমি জাভাতে একজন শিক্ষানবিশ হওয়ায় এটি একটি সহজ উত্তর *
তিনটি শ্রেণি আছে বিবেচনা করুন X
, Y
এবং Z
।
সুতরাং আমরা X extends Y, Z
এবং উভয়ের মতো উত্তরাধিকার সূত্রে পাই Y
এবং একই Z
পদ্ধতিতে alphabet()
একই পদ্ধতিতে ফিরে আসার পদ্ধতি এবং যুক্তি রয়েছে। এই পদ্ধতি alphabet()
মধ্যে Y
বলল বর্ণমালার প্রথম প্রদর্শন এবং পদ্ধতি বর্ণমালায় Z
বলছেন প্রদর্শন গত বর্ণমালা । সুতরাং এখানে দ্ব্যর্থহীনতা আসে যখন alphabet()
বলা হয় X
। এটি প্রথম বা শেষ বর্ণমালা প্রদর্শন করতে বলে কিনা ??? সুতরাং জাভা একাধিক উত্তরাধিকার সমর্থন করে না। ইন্টারফেস ক্ষেত্রে, বিবেচনা Y
এবং Z
ইন্টারফেস হিসাবে। সুতরাং উভয় পদ্ধতি ঘোষণা alphabet()
কিন্তু সংজ্ঞা থাকবে না। এটি প্রথম বর্ণমালা বা শেষ বর্ণমালা বা অন্য কিছু প্রদর্শন করবে কিনা তা জানায় না তবে কেবল কোনও পদ্ধতি ঘোষণা করবেalphabet()
। সুতরাং অস্পষ্টতা বাড়ানোর কোনও কারণ নেই। আমরা ক্লাসের ভিতরে যা চাই তার সাথে পদ্ধতিটি সংজ্ঞায়িত করতে পারি X
।
সুতরাং এক কথায়, ইন্টারফেস সংজ্ঞা বাস্তবায়নের পরে সম্পন্ন হয় তাই কোনও বিভ্রান্তি নেই।