জাভাতে কেন একাধিক উত্তরাধিকার নেই, তবে একাধিক ইন্টারফেস প্রয়োগের অনুমতি রয়েছে?


153

জাভা একাধিক উত্তরাধিকারের অনুমতি দেয় না, তবে এটি একাধিক ইন্টারফেস প্রয়োগ করতে দেয়। কেন?


1
এটিকে আরও বর্ণনামূলক করে তুলতে আমি প্রশ্নের শিরোনাম সম্পাদনা করেছি।
বোজহো

4
মজার বিষয় হল, জেডিকে 8-তে, সম্প্রসারণের পদ্ধতি থাকবে যা ইন্টারফেস পদ্ধতিগুলি বাস্তবায়নের সংজ্ঞাটিকে অনুমতি দেবে। বিধি আচরণ একাধিক উত্তরাধিকার শাসন করা সংজ্ঞায়িত করা হয়েছে, কিন্তু রাষ্ট্র (যা আমি বুঝতে বেশি নয় সমস্যাযুক্ত
এডুইন Dalorzo

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

উত্তর:


228

ইন্টারফেসগুলি শুধুমাত্র নির্দিষ্ট কারণ কি বর্গ করছে না কিভাবে এটা করছে।

একাধিক উত্তরাধিকারের সমস্যাটি হ'ল দুটি শ্রেণি একই জিনিস করার বিভিন্ন পদ্ধতি নির্ধারণ করতে পারে এবং সাবক্লাসটি কোনটি বেছে নেবে তা চয়ন করতে পারে না।


8
আমি সি ++ করতাম এবং বেশ কয়েকবার সেই একই সমস্যাটিতে চলে এসেছি। আমি সম্প্রতি স্ক্যালার "বৈশিষ্ট্য" থাকার বিষয়ে পড়েছি যা আমার কাছে "সি ++" উপায় এবং "জাভা" কাজের করার মধ্যে রয়েছে বলে মনে হয়।
নীল বাসজেস

2
এইভাবে, আপনি "ডায়মন্ড সমস্যা" এড়িয়ে চলেছেন
নিক এল।

6
জাভা 8 যেহেতু আপনি দুটি অভিন্ন ডিফল্ট পদ্ধতি নির্ধারণ করতে পারেন, প্রতিটি ইন্টারফেসের একটি। আপনি যদি নিজের ক্লাসে উভয় ইন্টারফেস প্রয়োগ করেন, আপনাকে ক্লাসে এই পদ্ধতিটি ওভাররাইড করতে হবে, দেখুন: docs.oracle.com/javase/tutorial/java/IandI/…
বববেল

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

1
"গুণাবলী" বলতে কী বোঝ?
বোহো

96

আমার কলেজের একজন প্রশিক্ষক আমাকে এভাবে ব্যাখ্যা করেছেন:

ধরুন আমার একটি ক্লাস আছে, যা টোস্টার, এবং অন্য ক্লাস, যা নিউক্লিয়ারবম্ব। তাদের উভয়ের একটি "অন্ধকার" সেটিংস থাকতে পারে। তাদের উভয়ের একটি অন () পদ্ধতি রয়েছে। (একটিতে একটি অফ () রয়েছে, অন্যটির নেই)) যদি আমি এমন একটি ক্লাস তৈরি করতে চাই যা এই দুটিরই একটি সাবক্লাস ... আপনি দেখতে পাচ্ছেন, এটি এমন একটি সমস্যা যা আমার মুখের সামনে সত্যিই ফুঁসে উঠতে পারে is ।

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

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


5
ধন্যবাদ, NomeN উক্ত উত্সের উত্স হলেন ব্রেন্ডন বার্নস নামে পিএইচডি শিক্ষার্থী, যিনি সেই সময় ওপেন সোর্স কোয়েক 2 সোর্স ভাণ্ডারের রক্ষণাবেক্ষণকারীও ছিলেন। চিত্রে যান.
সিনট্যাকটিক

4
এই সাদৃশ্যটির সমস্যাটি হ'ল আপনি যদি পারমাণবিক বোমা এবং একটি টোস্টের সাবক্লাস তৈরি করে থাকেন তবে ব্যবহৃত হলে "পারমাণবিক টোস্টার" যুক্তিসঙ্গতভাবে ফুঁসে উঠবে।
101100

20
যদি কেউ পারমাণবিক বোমা এবং একটি টোস্টারকে মিশ্রিত করার সিদ্ধান্ত নেয় তবে তিনি দাবি করেন যে বোমাটি তার মুখে ফুঁকছে। উদ্ধৃতিটি
মিথ্যা

1
একই প্রোগ্রামিং ভাষা একাধিক "ইন্টারফেস" উত্তরাধিকারের অনুমতি দেয়, সুতরাং এই "ন্যায়সঙ্গততা" প্রয়োগ হয় না apply
কৌতূহলী

24

কারণ "হেই, এই পদ্ধতিটি দরকারী মনে হচ্ছে না, এমনকি উত্তরাধিকারকে অতিরিক্ত ব্যবহার করা হয়েছে , আমি সেই শ্রেণিটিও প্রসারিত করব"।

public class MyGodClass extends AppDomainObject, HttpServlet, MouseAdapter, 
             AbstractTableModel, AbstractListModel, AbstractList, AbstractMap, ...

আপনি ব্যাখ্যা করতে পারেন কেন আপনি বলেন যে উত্তরাধিকার অতিরিক্ত ব্যবহার করা হয়নি? Godশ্বর শ্রেণি তৈরি করা ঠিক আমি যা করতে চাই! আমি এমন অনেক লোককে খুঁজে পাই যারা স্থিতিশীল পদ্ধতিযুক্ত "সরঞ্জাম" ক্লাস তৈরি করে একক উত্তরাধিকার নিয়ে কাজ করে।
ডানকান কালভার্ট

9
@ ডানক্যালভার্ট: না, আপনি এটি করতে চান না, যদি সেই কোডটির কোনও রক্ষণাবেক্ষণের প্রয়োজন হয় না not স্ট্যাটিক পদ্ধতি প্রচুর OO যেমন পণ্য বিন্দু ব্যার্থ কিন্তু অত্যধিক একাধিক সম্পত্তি হল অনেক খারাপ কারণ আপনার সম্পূর্ণরূপে হারান ট্র্যাক যার কোড ব্যবহার করা হয় যেখানে, পাশাপাশি কি একটি শ্রেণী ধারণার দিক হিসাবে। দু'জনেই "যেখানে আমার প্রয়োজন সেখানে এই কোডটি কীভাবে ব্যবহার করতে পারি" এর সমস্যাটি সমাধান করার চেষ্টা করছেন, তবে এটি একটি সহজ স্বল্পমেয়াদী সমস্যা। যথাযথ ওও ডিজাইনের মাধ্যমে দীর্ঘমেয়াদী সমস্যার সমাধান হ'ল "
অপ্রয়োজনীয়

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

18

এই প্রশ্নের উত্তরটি জাভা সংকলক (কনস্ট্রাক্টর চেইনিং) এর অভ্যন্তরীণ কাজের মধ্যে রয়েছে। যদি আমরা জাভা সংকলকের অভ্যন্তরীণ কাজ দেখতে পাই:

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পদ্ধতির জন্য দয়া করে ইন্টারফেসে ডিফল্ট উল্লেখ করুন

আশা করি এটি আপনার প্রশ্নের সমাধান করবে। ধন্যবাদ।


7

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


"মৃত্যুর হীরা" নিয়ে সমস্যা কী?
কৌতূহলী

2
@ কুরিয়াসগুই একই বেস শ্রেণীর একাধিক সাববোজেক্ট, অস্পষ্টতা (যার ভিত্তিটি বর্গ শ্রেণীর ব্যবহার থেকে ওভাররাইড), এ জাতীয় অস্পষ্টতা সমাধানের জটিল নিয়ম।
টাদিউস কোপেক

@ কুরিজগুই: যদি কোনও কাঠামো সরবরাহ করে যে বেস-টাইপ রেফারেন্সের জন্য কোনও অবজেক্ট রেফারেন্স কাস্টিং পরিচয় সংরক্ষণ করা হবে, তবে প্রতিটি বস্তুর ক্ষেত্রে অবশ্যই কোনও বেস-ক্লাস পদ্ধতিতে একটির প্রয়োগ থাকতে হবে। যদি ToyotaCarএবং HybridCarউভয়ই উদ্ভূত হয় Carএবং ওভাররড হয় Car.Driveএবং যদি PriusCarউভয়ই উত্তরাধিকার সূত্রে প্রাপ্ত হয় তবে ওভাররাইড না হয়Drive তবে ভার্চুয়ালটি কী করা Car.Driveউচিত তা চিহ্নিত করার সিস্টেমটির কোনও উপায় থাকবে না। ইন্টারফেসগুলি উপরের ইতরুক্ত অবস্থা এড়িয়ে এই সমস্যাটি এড়ায়।
সুপারক্যাট

1
@ সুপের্যাট "ভার্চুয়াল কার.ড্রাইভকে কী করা উচিত তা চিহ্নিত করার সিস্টেমটির কোনও উপায় নেই have" <- অথবা এটি কেবল একটি সংকলন ত্রুটি দিতে পারে এবং আপনাকে সি ++ এর মতো স্পষ্টভাবে একটি চয়ন করতে পারে।
ক্রিস মিডলটন

1
@ ক্রিসমিল্ডন: একটি পদ্ধতি void UseCar(Car &foo); দ্ব্যর্থতা নিরসন মধ্যে অন্তর্ভুক্ত করা আশা করা যায় না ToyotaCar::Driveএবং HybridCar::Drive(যে যারা অন্যান্য ধরনের এমনকি যেহেতু এটি প্রায়ই তন্ন তন্ন জানা উচিত কিংবা যত্ন অস্তিত্ব )। সি ++ এর মতো একটি ভাষার জন্য কোডটি ToyotaCar &myCarপাস করার ইচ্ছের সাথে UseCarঅবশ্যই কোডটি প্রথমে হয় হয় HybridCarবা হয় ToyotaCar, তবে ((কার) (হাইব্রিডকার) মাইকার) থাকতে ((Car)(ToyotaCar)myCar).Drive হবে `ড্রাইভ এবং বিভিন্ন কাজ করতে পারে, যা বোঝায় যে আপকাস্টগুলি পরিচয়-সংরক্ষণ ছিল না।
সুপারক্যাট

6

আপনি একাধিক উত্তরাধিকার সম্পর্কে ওরাকল ডকুমেন্টেশন পৃষ্ঠায় এই প্রশ্নের জন্য সঠিক উত্তর পেতে পারেন

  1. একাধিক রাষ্ট্রের উত্তরাধিকার: একাধিক শ্রেণী থেকে ক্ষেত্র উত্তরাধিকারী হওয়ার ক্ষমতা

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

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

    1. যদি বিভিন্ন সুপার ক্লাসের পদ্ধতি বা নির্মাণকারীরা একই ক্ষেত্রটি ইনস্ট্যান্ট করে?
    2. কোন পদ্ধতি বা নির্মাতা অগ্রাধিকার গ্রহণ করবে?
  2. বাস্তবায়নের একাধিক উত্তরাধিকার: একাধিক শ্রেণি থেকে পদ্ধতি সংজ্ঞা উত্তরাধিকারী হওয়ার ক্ষমতা

    এই পদ্ধতির সাথে সমস্যাগুলি: নাম বিবাদ ts এবং অস্পষ্টতা । যদি একটি সাবক্লাস এবং সুপারক্লাসে একই পদ্ধতির নাম (এবং স্বাক্ষর) থাকে তবে সংকলক কোন সংস্করণটি প্রার্থনা করবে তা নির্ধারণ করতে পারে না।

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

    হীরা সমস্যা সমাধানের বিষয়ে আরও তথ্যের জন্য এসই পোস্টের নীচে দেখুন:

    জাভা 8-এ অ্যাবস্ট্রাক্ট ক্লাস এবং ইন্টারফেসের মধ্যে পার্থক্য কী?

  3. একাধিক প্রকারের উত্তরাধিকার: একাধিক ইন্টারফেস প্রয়োগের শ্রেণীর সক্ষমতা।

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


4

বলা হয়ে থাকে যে অবজেক্টস স্টেটটিকে ক্ষেত্রগুলির ক্ষেত্রে শ্রদ্ধার সাথে উল্লেখ করা হয় এবং যদি অনেক শ্রেণি উত্তরাধিকার সূত্রে প্রাপ্ত হয় তবে এটি অস্পষ্ট হয়ে উঠবে। লিঙ্কটি এখানে

http://docs.oracle.com/javase/tutorial/java/IandI/multipleinheritance.html


4

জাভা কেবল ইন্টারফেসের মাধ্যমে একাধিক উত্তরাধিকার সমর্থন করে। একটি শ্রেণি যে কোনও সংখ্যক ইন্টারফেস বাস্তবায়ন করতে পারে তবে কেবল একটি শ্রেণি প্রসারিত করতে পারে।

একাধিক উত্তরাধিকার সমর্থিত নয় কারণ এটি মারাত্মক হীরা সমস্যার দিকে পরিচালিত করে। তবে এটি সমাধান করা যেতে পারে তবে এটি জটিল ব্যবস্থায় নিয়ে যায় তাই একাধিক উত্তরাধিকার জাভা প্রতিষ্ঠাতারা বাদ দিয়েছেন।

ফেব্রুয়ারী 1995 সালে জেমস গোসলিংয়ের "জাভা: একটি ওভারভিউ" শিরোনামে একটি সাদা কাগজে ( লিঙ্ক ) জাভাতে কেন একাধিক উত্তরাধিকার সমর্থন করা যায় না সে সম্পর্কে ধারণা দেয়।

গোসলিংয়ের মতে:

"জাভা C ++ এর অনেক কম ব্যবহার করা, দুর্বল বোঝা, বিভ্রান্তিকর বৈশিষ্ট্য বাদ দেয় যা আমাদের অভিজ্ঞতায় আরও বেশি দুঃখ নিয়ে আসে। T এর চেয়ে বেশি This এটি মূলত অপারেটর ওভারলোডিং (যদিও এতে পদ্ধতি ওভারলোডিং রয়েছে), একাধিক উত্তরাধিকার এবং বিস্তৃত স্বয়ংক্রিয় জবরদস্তি নিয়ে গঠিত।"


লিঙ্কটি অ্যাক্সেসযোগ্য নয়। দয়া করে এটি পরীক্ষা করে আপডেট করুন।
মাশুকখান

3

একই কারণে সি # একাধিক উত্তরাধিকারের অনুমতি দেয় না তবে আপনাকে একাধিক ইন্টারফেস প্রয়োগ করতে দেয়।

সি ++ ডাব্লু / একাধিক উত্তরাধিকারের কাছ থেকে যে পাঠটি শিখেছে তা হ'ল এটি মূল্যবান হওয়ার চেয়ে আরও বেশি সমস্যার দিকে পরিচালিত করে।

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

একাধিক ইন্টারফেসের অনুমতি দিলে আপনি একাধিক উত্তরাধিকার ব্যবহার করে একই ধরণের সমস্যা সমাধান করতে ডিজাইন প্যাটার্নগুলি (অ্যাডাপ্টারের মতো) ব্যবহার করতে পারবেন তবে আরও নির্ভরযোগ্য এবং অনুমানযোগ্য পদ্ধতিতে।


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

2
@ আলেকজান্ডারপোগ্রেবন্যাক: নিম্নলিখিত তিনটি থেকে দুটি বেছে নিন: (1) একটি অতিপ্রত্যঙ্গ রেফারেন্সের উপ-টাইপ রেফারেন্স থেকে পরিচয়-সংরক্ষণের বর্ণকে অনুমতি দিন; (২) কোনও শ্রেণিকে উদ্ভূত শ্রেণীর পুনর্নির্মাণ না করে ভার্চুয়াল পাবলিক সদস্য যুক্ত করার অনুমতি দিন; (3) কোনও শ্রেণিকে স্পষ্টভাবে নির্দিষ্ট করে না দিয়ে একাধিক বেস শ্রেণীর ভার্চুয়াল সদস্যদের স্পষ্টতভাবে উত্তরাধিকার সূত্রে অনুমতি দিন। আমি বিশ্বাস করি না যে কোনও ভাষার পক্ষে উপরের তিনটিটিই পরিচালনা করা সম্ভব। জাভা # 1 এবং # 2 এর জন্য বেছে নিয়েছে এবং সি # অনুসরণ করেছে। আমি বিশ্বাস করি যে সি ++ কেবলমাত্র # 3 গ্রহণ করে। ব্যক্তিগতভাবে, আমি মনে করি যে # 1 এবং # 2 # 3 এর চেয়ে বেশি কার্যকর তবে অন্যদের মধ্যে পৃথক হতে পারে।
সুপারক্যাট

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

@ দ্য পারম্যাগনেটিক ক্রোস্যান্ট: সিমেন্টিক সমস্যাটি হল # 1। যদি D1এবং D2থেকে উভয় উত্তরাধিকারী B, এবং প্রতিটি ওভাররাইড একটি ফাংশন f, এবং যদি objএকটি টাইপ একটি দৃষ্টান্ত হল Sযা উভয় থেকে উত্তরাধিকারী D1এবং D2কিন্তু ওভাররাইড না f, তারপর একটি রেফারেন্স কাস্ট Sকরার D1কিছু যার উত্পাদ উচিত fব্যবহারসমূহ D1ওভাররাইড, এবং এ কাস্ট Bনা করা উচিত যে পরিবর্তন। একইভাবে একটি রেফারেন্স ভোটদান Sথেকে D2একটা কিছু যার উত্পাদ উচিত fব্যবহারসমূহ D2ওভাররাইড, এবং এ কাস্ট Bযে পরিবর্তন করা উচিত নয়। কোনও ভাষার যদি ভার্চুয়াল সদস্যদের যুক্ত করার অনুমতি না দেওয়া হয় ...
সুপারক্যাট

1
@ দ্য পারম্যাগনেটিক ক্রোস্যান্ট: এটি হতে পারে এবং আমার পছন্দের তালিকাটি কোনও মন্তব্যে ফিট করার জন্য কিছুটা সহজ-সরল ছিল, তবে রান-টাইমের পিছনে পিছিয়ে যাওয়া ডি 1, ডি 2, বা এস এর লেখকের পক্ষে তা ভঙ্গ না করে কী পরিবর্তন করতে পারে তা জানা অসম্ভব করে তোলে তাদের শ্রেণীর গ্রাহকরা।
ক্যাট

2

যেহেতু এই বিষয়টি নিকটবর্তী নয় আমি এই উত্তরটি পোস্ট করব, আশা করি এটি কাউকে বুঝতে সাহায্য করবে যে কেন জাভা একাধিক উত্তরাধিকার অনুমতি দেয় না।

নিম্নলিখিত শ্রেণীর বিবেচনা করুন:

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

কারণ একটি ইন্টারফেস কেবল একটি চুক্তি। এবং একটি বর্গ আসলে তথ্য জন্য একটি ধারক হয়।


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

1

উদাহরণস্বরূপ দুটি শ্রেণি এ, বি একই পদ্ধতি এম 1 () রয়েছে। এবং ক্লাস সি এ, বি উভয় প্রসারিত করে

 class C extends A, B // for explaining purpose.

এখন, ক্লাস সি এম 1 এর সংজ্ঞাটি অনুসন্ধান করবে। প্রথমত, এটি শ্রেণিতে অনুসন্ধান করবে যদি এটি না পাওয়া যায় তবে এটি পিতামাতার ক্লাসে যাচাই করবে। A, B উভয়েরই সংজ্ঞা রয়েছে সুতরাং এখানে অস্পষ্টতা দেখা দেয় কোন সংজ্ঞাটি বেছে নেওয়া উচিত। সুতরাং জাভা মাল্টিপল ইনহরিটি সাপোর্ট করে না।


জাভা সংকলক তৈরির বিষয়ে কীভাবে সংকলক দেয় যদি একই পদ্ধতি বা ভেরিয়েবল উভয়
পিতৃ

1

জাভা দুটি কারণে একাধিক উত্তরাধিকার সমর্থন করে না:

  1. জাভাতে প্রতিটি ক্লাসই ক্লাসের শিশু Object। যখন এটি একাধিক সুপার শ্রেণীর কাছ থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হয়, সাব ক্লাসটি অবজেক্ট শ্রেণির সম্পত্তি অর্জনের অস্পষ্টতা অর্জন করে ..
  2. জাভাতে প্রতিটি শ্রেণীর একটি কনস্ট্রাক্টর থাকে, যদি আমরা তা স্পষ্টভাবে লিখি বা না লিখি। প্রথম বিবৃতিটিতে super()সাপার ক্লাস কনস্ট্রাক্টরকে আহ্বান জানানো হচ্ছে। ক্লাসে একাধিক সুপার ক্লাস থাকলে তা বিভ্রান্ত হয়।

সুতরাং যখন একটি শ্রেণি একাধিক সুপার ক্লাস থেকে প্রসারিত হয়, আমরা সংকলন সময় ত্রুটি পাই।


0

উদাহরণস্বরূপ বিবেচনা করুন, যেখানে ক্লাস এ এর ​​গেটসোমিংথ পদ্ধতি রয়েছে এবং ক্লাস বিতে গেটসোমিংথ পদ্ধতি রয়েছে এবং ক্লাস সি এর বি এবং এ বি বাড়ানো হয়েছে, কেউ যদি সিগেটসোমিংথিং বলে তবে কি হবে? কোন পদ্ধতিটি কল করতে হবে তা নির্ধারণের কোনও উপায় নেই।

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


2
" কেউ যদি সিগেটসোমিংথিং বলে তবে কি হবে " "এটি সি ++ তে একটি ত্রুটি। সমস্যা সমাধান.
কৌতূহলী

এটি ছিল পয়েন্ট ... এটি একটি পাল্টা উদাহরণ যা আমি ভেবেছিলাম স্পষ্ট। আমি নির্দেশ করছিলাম যে কোন পদ্ধতিটি কল করা উচিত তা নির্ধারণের কোনও উপায় নেই। পাশাপাশি একটি নোট হিসাবে, প্রশ্নটি জাভা সম্পর্কিত নয় সি ++
জন কেন

আমি দুঃখিত যে আপনার বক্তব্যটি আমি পাই না। স্পষ্টতই, এমআই এর সাথে কিছু ক্ষেত্রে অস্পষ্টতা রয়েছে। কিভাবে এটি একটি পাল্টা উদাহরণ? কে দাবি করেছে যে এমআই কখনই অস্পষ্টতার সৃষ্টি করে না? " পাশাপাশি, নোট হিসাবেও প্রশ্নটি জাভা সম্পর্কিত নয়, সি ++ " তাই?
কৌতূহলী

আমি কেবল দেখানোর চেষ্টা করছিলাম কেন সেই অস্পষ্টতা বিদ্যমান এবং কেন এটি ইন্টারফেসের সাথে নেই।
জন কেনে

হ্যাঁ, এমআই ফলাফল অস্পষ্ট কল করতে পারে। সুতরাং ওভারলোডিং করতে পারেন। সুতরাং জাভা ওভারলোডিং অপসারণ করা উচিত?
কৌতূহলী

0

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


0

অস্পষ্টতা সমস্যার কারণে জাভা একাধিক উত্তরাধিকার, মাল্টিপথ এবং সংকর উত্তরাধিকারকে সমর্থন করে না:

 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


0

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


1
আপনি কেবল এখানে উদাহরণ পোস্ট করতে পারে। এটি ছাড়া এটি 9 বছরের পুরানো প্রশ্নের একশ বার বার পাঠ্যের ব্লকের মতো দেখাচ্ছে।
পোচমুরনিক

-1

* আমি জাভাতে একজন শিক্ষানবিশ হওয়ায় এটি একটি সহজ উত্তর *

তিনটি শ্রেণি আছে বিবেচনা করুন X, Yএবং Z

সুতরাং আমরা X extends Y, Z এবং উভয়ের মতো উত্তরাধিকার সূত্রে পাই Yএবং একই Zপদ্ধতিতে alphabet()একই পদ্ধতিতে ফিরে আসার পদ্ধতি এবং যুক্তি রয়েছে। এই পদ্ধতি alphabet()মধ্যে Yবলল বর্ণমালার প্রথম প্রদর্শন এবং পদ্ধতি বর্ণমালায় Zবলছেন প্রদর্শন গত বর্ণমালা । সুতরাং এখানে দ্ব্যর্থহীনতা আসে যখন alphabet()বলা হয় X। এটি প্রথম বা শেষ বর্ণমালা প্রদর্শন করতে বলে কিনা ??? সুতরাং জাভা একাধিক উত্তরাধিকার সমর্থন করে না। ইন্টারফেস ক্ষেত্রে, বিবেচনা Yএবং Zইন্টারফেস হিসাবে। সুতরাং উভয় পদ্ধতি ঘোষণা alphabet()কিন্তু সংজ্ঞা থাকবে না। এটি প্রথম বর্ণমালা বা শেষ বর্ণমালা বা অন্য কিছু প্রদর্শন করবে কিনা তা জানায় না তবে কেবল কোনও পদ্ধতি ঘোষণা করবেalphabet()। সুতরাং অস্পষ্টতা বাড়ানোর কোনও কারণ নেই। আমরা ক্লাসের ভিতরে যা চাই তার সাথে পদ্ধতিটি সংজ্ঞায়িত করতে পারি X

সুতরাং এক কথায়, ইন্টারফেস সংজ্ঞা বাস্তবায়নের পরে সম্পন্ন হয় তাই কোনও বিভ্রান্তি নেই।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.