উত্তরাধিকারের চেয়ে রচনা পছন্দ?


1603

উত্তরাধিকারের চেয়ে রচনা কেন পছন্দ করবেন? প্রতিটি পদ্ধতির জন্য কি ট্রেড অফ রয়েছে? কখন আপনি রচনা উত্তরাধিকার চয়ন করা উচিত?



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

1
এক বাক্যে উত্তরাধিকার যদি আপনার সর্বজনীন পদ্ধতি থাকে এবং আপনি এটি পরিবর্তন করেন তবে প্রকাশিত এপিআই পরিবর্তন হবে। যদি আপনার রচনা থাকে এবং রচিত বস্তু পরিবর্তিত হয় তবে আপনাকে আপনার প্রকাশিত এপিআই পরিবর্তন করতে হবে না।
টমর বেন ডেভিড

উত্তর:


1188

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

উপরেরগুলির জন্য আমার অ্যাসিড পরীক্ষাটি হ'ল:

  • টাইপবি যেখানে টাইপএ প্রত্যাশিত যেখানে টাইপবি ব্যবহার করা যেতে পারে তেমন টাইপএর সম্পূর্ণ ইন্টারফেস (সমস্ত পাবলিক পদ্ধতি কম নয়) প্রকাশ করতে চায়? উত্তরাধিকার সূচিত করে ।

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

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

আপডেট: সবেমাত্র আমার জবাব ফিরে এসেছিল এবং এখন মনে হচ্ছে বার্বারা লিসকভের লিসকোভ সাবস্টিটিউশন নীতিমালার 'আমার কি এই ধরণের উত্তরাধিকার হতে হবে?' এর পরীক্ষা হিসাবে নির্দিষ্ট উল্লেখ করা ছাড়া এটি অসম্পূর্ণ ?


81
দ্বিতীয় উদাহরণটি সরাসরি ফার্স্ট ডিজাইনের প্যাটার্নগুলি ( অ্যামাজন / ফার্স্ট- ডিজাইন- প্যাটার্নস- ইলিশাবেথ- ফ্রিমন / ডিপি / )) বইয়ের বাইরে রয়েছে :) আমি এই বইটির যে কেউ এই প্রশ্নটি গুগল করছে তাদের আমি সেই বইটির সর্বাধিক পরামর্শ দেব।
যিশুরুন

4
এটি খুব স্পষ্ট, তবে এটি কিছু মিস করতে পারে: "টাইপবি কি টাইপএ যেমন প্রত্যাশিত যেখানে টাইপবি ব্যবহার করা যেতে পারে যেমন টাইপএর সম্পূর্ণ ইন্টারফেস (সমস্ত সরকারী পদ্ধতি কম নয়) প্রকাশ করতে চায়?" তবে এটি যদি সত্য হয় এবং টাইপবি টাইপসির সম্পূর্ণ ইন্টারফেসটিও প্রকাশ করে? এবং যদি টাইপসি এখনও মডেল করা না হয়েছে?
ত্রিস্তান

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

22
@ অ্যালেক্সি - মূল বক্তব্যটি হ'ল 'আমি কি সমস্ত ক্লায়েন্টকে সেসনা বাইপলেনে বিস্মিত না করে বিমানের প্রত্যাশা করতে পারি?'। যদি হ্যাঁ, তবে সম্ভাবনা কি আপনি উত্তরাধিকার চান।
গিশু

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

413

একটি সম্পর্ক আছে হিসাবে ধারক সম্পর্কে ভাবেন । একটি গাড়ীর একটি "ইঞ্জিন" থাকে, একজন ব্যক্তির "নাম" থাকে ইত্যাদি has

উত্তরাধিকার চিন্তা হিসাবে একটি একটি হল সম্পর্ক। একটি গাড়ী "একটি" যানবাহন, একটি ব্যক্তি "একটি" স্তন্যপায়ী ইত্যাদি "is

আমি এই পদ্ধতির জন্য কোনও কৃতিত্ব গ্রহণ করি না। স্টিভ ম্যাককনেল , বিভাগ 6.3 দ্বারা সম্পূর্ণ কোডের দ্বিতীয় সংস্করণ থেকে আমি এটিকে সরাসরি গ্রহণ করেছি ।


107
এটি সর্বদা একটি নিখুঁত পদ্ধতির নয়, এটি কেবল একটি ভাল গাইডলাইন। লিসকভ সাবস্টিটিউশন নীতিটি অনেক বেশি নির্ভুল (কম ব্যর্থ হয়)।
বিল কে

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

36
@ নিক শিওর, তবে "আমার গাড়িতে একটি যানবাহন রয়েছে" আরও বুদ্ধিমান হয়েছে (আমার ধারণা আপনার "যানবাহন" শ্রেণীর নামকরণ করা যেতে পারে "VehicalBehaviour")। সুতরাং আপনি নিজের সিদ্ধান্তটিকে "ভার্সেস" একটি "তুলনা" ভিত্তিতে রাখতে পারবেন না, আপনাকে এলএসপি ব্যবহার করতে হবে, বা আপনি ভুল করতে পারবেন
ত্রিস্তান

35
"এর পরিবর্তে" একটি "চিন্তাভাবনা" এর মতো আচরণ করে। উত্তরাধিকার হ'ল উত্তরাধিকার সূত্রে প্রাপ্ত আচরণ সম্পর্কে, কেবল শব্দার্থক শব্দগুলি নয়।
ybakos

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

210

আপনি যদি পার্থক্যটি বুঝতে পারেন তবে এটি ব্যাখ্যা করা সহজ।

কার্যবিধির কোড

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

উত্তরাধিকার

এটি ক্লাসের ব্যবহারকে উত্সাহ দেয়। উত্তরাধিকার হ'ল ওও ডিজাইনের তিনটি ধারার একটি (উত্তরাধিকার, পলিমারফিজম, এনক্যাপসুলেশন)।

class Person {
   String Title;
   String Name;
   Int Age
}

class Employee : Person {
   Int Salary;
   String Title;
}

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

গঠন

উত্তরাধিকারের তুলনায় রচনা পছন্দসই। এটিকে খুব সহজভাবে বলতে গেলে আপনার এই হবে:

class Person {
   String Title;
   String Name;
   Int Age;

   public Person(String title, String name, String age) {
      this.Title = title;
      this.Name = name;
      this.Age = age;
   }

}

class Employee {
   Int Salary;
   private Person person;

   public Employee(Person p, Int salary) {
       this.person = p;
       this.Salary = salary;
   }
}

Person johnny = new Person ("Mr.", "John", 25);
Employee john = new Employee (johnny, 50000);

রচনা সাধারণত "একটি" বা "ব্যবহার" একটি সম্পর্ক আছে। এখানে কর্মী শ্রেণীর একজন ব্যক্তি রয়েছে। এটি ব্যক্তির কাছ থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হয় না তবে পরিবর্তে ব্যক্তি বস্তু এটিতে প্রেরণ করে, এ কারণেই এটির একজন "ব্যক্তি" রয়েছে।

উত্তরাধিকার উপর রচনা

এখন বলুন যে আপনি কোনও ম্যানেজারের ধরন তৈরি করতে চান যাতে আপনার এটি শেষ হয়:

class Manager : Person, Employee {
   ...
}

এই উদাহরণটি ঠিক কাজ করবে, তবে ব্যক্তি এবং কর্মচারী উভয়ই ঘোষণা করলে Titleকী হবে? ম্যানেজার.টাইটেলকে "ম্যানেজার অফ অপারেশনস" বা "মিঃ" ফিরিয়ে দেওয়া উচিত? রচনা অনুসারে এই অস্পষ্টতা আরও ভালভাবে পরিচালনা করা হয়:

Class Manager {
   public string Title;
   public Manager(Person p, Employee e)
   {
      this.Title = e.Title;
   }
}

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


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

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

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

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

9
(... অব্যাহত) ব্যক্তি এবং কর্মচারী উভয়ের কাছ থেকে উত্তরাধিকারী হওয়া - সর্বোপরি, কর্মী ইতিমধ্যে ব্যক্তি থেকে উত্তরাধিকার সূত্রে প্রাপ্ত। আরও জটিল মডেলগুলিতে, যেখানে কোনও ব্যক্তি একজন পরিচালক এবং এজেন্ট হতে পারেন, একথা সত্য যে একাধিক উত্তরাধিকার ব্যবহার করা যেতে পারে (সাবধানতার সাথে!) তবে এটি অনেকগুলি পরিবেশে একটি বিমূর্ত রোল ক্লাস থাকা থেকে ম্যানেজারের (কর্মচারী সমন্বিত) থাকা ভাল would এস / তিনি পরিচালনা করেন) এবং এজেন্ট (চুক্তি এবং অন্যান্য তথ্য ধারণ করে) উত্তরাধিকার সূত্রে প্রাপ্ত। তারপরে, একজন কর্মচারী হলেন এমন এক ব্যক্তি যার একাধিক ভূমিকা রয়েছে। সুতরাং, রচনা এবং উত্তরাধিকার উভয়ই সঠিকভাবে ব্যবহৃত হয়।
রেডন রোসবারো

141

উত্তরাধিকার সূত্রে প্রদত্ত সমস্ত অনস্বীকার্য সুবিধা সহ এর কিছু অসুবিধা এখানে রয়েছে।

উত্তরাধিকারের অসুবিধা:

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

অন্যদিকে অবজেক্ট কম্পোজিশনটি অন্যান্য অবজেক্টের রেফারেন্স অর্জনকারী বস্তুর মাধ্যমে রানটাইম সংজ্ঞায়িত হয়। এরকম ক্ষেত্রে এই বস্তুগুলি কখনই একে অপরের সুরক্ষিত ডেটাতে পৌঁছাতে সক্ষম হবে না (কোনও এনক্যাপসুলেশন বিরতি নেই) এবং একে অপরের ইন্টারফেসকে সম্মান করতে বাধ্য হবে। এবং এই ক্ষেত্রেও, উত্তরাধিকারের ক্ষেত্রে বাস্তবায়ন নির্ভরতা অনেক কম হবে।


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

3
এই পোস্টের শেষ অনুচ্ছেদটি সত্যিই আমার জন্য ক্লিক করেছে। ধন্যবাদ.
সালেক্স

87

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


81

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

আপনি খেতে চাইলে আপনার কোকাকোলা থেকে আলু পছন্দ করা উচিত এবং আপনি যখন পান করতে চান তখন আলুর চেয়ে কোকাকোলা।

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

সুতরাং আমার কাছে দেখে মনে হচ্ছে কেউ যদি জানতে না পারে যে তার উত্তরাধিকার বা রচনা দরকার কিনা, আসল সমস্যা হ'ল তিনি জানেন না তিনি পান করতে চান বা খেতে চান কিনা। আপনার সমস্যা ডোমেন সম্পর্কে আরও চিন্তা করুন, এটি আরও ভাল করে বুঝতে।


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

61

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

উত্তরাধিকার সম্ভবত আপনার সংযোগের সবচেয়ে খারাপ রূপ

আপনার বেস ক্লাসটি সুরক্ষিত সদস্যদের আকারে সাবক্লাসে প্রয়োগের বিশদটি প্রকাশ করে এনক্যাপসুলেশন ভেঙে দেয়। এটি আপনার সিস্টেমকে কঠোর এবং ভঙ্গুর করে তোলে। আরও দুঃখজনক ত্রুটিটি হ'ল নতুন সাবক্লাসটি উত্তরাধিকার শৃঙ্খলার সমস্ত জিনিসপত্র এবং মতামত নিয়ে আসে।

নিবন্ধ, উত্তরাধিকার হ'ল মন্দ: ডেটাঅ্যানোটেশনস মডেলবাইন্ডারের এপিক ব্যর্থ, সি # তে এর উদাহরণ দিয়ে চলেছে । এটি উত্তরাধিকারের ব্যবহার দেখায় যখন রচনাটি ব্যবহার করা উচিত ছিল এবং কীভাবে এটি রিফ্যাক্ট করা যায়।


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

42

জাভা বা সি # তে, কোনও জিনিস একবার ইনস্ট্যান্ট হয়ে গেলে তার প্রকারটি পরিবর্তন করতে পারে না।

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

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


10
+1 আমি কম এবং কম পেয়েছি যে উত্তরাধিকার বেশিরভাগ পরিস্থিতিতে কাজ করে। আমি শেয়ার্ড / উত্তরাধিকারসূত্রে ইন্টারফেস এবং অবজেক্টের সংমিশ্রণকে অনেক বেশি পছন্দ করি .... বা এগ্রিগেশন বলা হয়? আমাকে জিজ্ঞাসা করবেন না, আমি ইই ডিগ্রি পেয়েছি !!
কেনে

আমি বিশ্বাস করি যে এটিই সর্বাধিক সাধারণ দৃশ্যে যেখানে "ইনরিয়েন্সের ওপরে রচনা" প্রয়োগ করা হয় যেহেতু উভয়ই তত্ত্বের ক্ষেত্রে উপযুক্ত হতে পারে। উদাহরণস্বরূপ, একটি বিপণন সিস্টেমে আপনি একটি ধারণা থাকতে পারে Client। তারপরে, PreferredClientপরে একটি পপস এর একটি নতুন ধারণা পপ আপ হয়। করা উচিত PreferredClientউত্তরাধিকারী Client? একটি পছন্দসই ক্লায়েন্ট 'একটি' ক্লায়েন্ট পুরোপুরি, না? ঠিক আছে, এত তাড়াতাড়ি নয় ... আপনি যেমন বলেছিলেন যে রানটাইমে অবজেক্টগুলি তাদের শ্রেণি পরিবর্তন করতে পারে না। আপনি কীভাবে client.makePreferred()অপারেশনকে মডেল করবেন ? সম্ভবত উত্তরটি নিখোঁজ ধারণাটির সাথে রচনাটি ব্যবহারের মধ্যে রয়েছে, Accountসম্ভবত?
প্ল্লেক্স

বিভিন্ন ধরণের Clientক্লাস করার পরিবর্তে , সম্ভবত এখানে কেবল একটিই রয়েছে Accountযা একটি StandardAccountবা একটি হতে পারে এমন ধারণাটি আবদ্ধ করে PreferredAccount...
প্ল্লেক্স

40

এখানে সন্তোষজনক উত্তর পাওয়া যায় নি, তাই আমি একটি নতুন লিখেছি।

কেন " পছন্দ করেন তা বোঝার জন্য উত্তরাধিকারের চেয়ে রচনাটিকে আমাদের প্রথমে এই সংক্ষিপ্ত প্রতিমাটি বাদ দেওয়া অনুমানটি ফিরে পাওয়া দরকার।

উত্তরাধিকারের দুটি সুবিধা রয়েছে: সাবটাইপিং এবং সাবক্লাসিং

  1. সাবটাইপিংয়ের অর্থ একটি প্রকারের (ইন্টারফেস) স্বাক্ষরের সাথে মানানসই, অর্থাৎ এপিআই-র একটি সেট এবং সাব-টাইপিং পলিমারফিজম অর্জনের জন্য স্বাক্ষরের একটি অংশকে ওভাররাইড করতে পারে।

  2. সাবক্লাসিংয়ের অর্থ পদ্ধতি বাস্তবায়নের অন্তর্ভুক্ত পুনরায় ব্যবহার use

দুটি বেনিফিটের সাথে উত্তরাধিকার সম্পাদনের দুটি পৃথক উদ্দেশ্য রয়েছে: উপ-টাইপ ওরিয়েন্টেড এবং কোড পুনরায় ব্যবহারমুখী।

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

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

সাব টাইপ করার জন্য কোনও ধরণের স্বাক্ষরের সাথে সামঞ্জস্য করা হয়, এর অর্থ কমপিউশনটি সর্বদা এই ধরণের এপিআইয়ের কম পরিমাণে প্রকাশ করতে পারে। এখন বাণিজ্য বন্ধ শুরু:

  1. উত্তরাধিকারসূত্রে ওভাররাইড না করা হলে সোজা কোডের পুনঃব্যবহার সরবরাহ করে, যখন রচনাটি প্রতিটি এপিআইকে পুনরায় কোড করতে হয়, যদিও এটি প্রতিনিধিদের কেবল একটি সহজ কাজ।

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

  3. উত্তরাধিকার সুরক্ষিত সদস্যদের উদ্ভাসিত করে । এটি প্যারেন্ট ক্লাসের এনক্যাপসুলেশনটি ভেঙে দেয় এবং সাবক্লাস দ্বারা ব্যবহৃত হয় তবে শিশু এবং তার পিতামাতার মধ্যে আরেকটি নির্ভরতা প্রবর্তিত হয়।

  4. সংমিশ্রণটি নিয়ন্ত্রণের বিপরীতমুখী হতে পারে এবং ডেকোরেটর প্যাটার্ন এবং প্রক্সি প্যাটার্নে যেমন প্রদর্শিত হয় তেমন নির্ভরতা গতিময়ভাবে ইনজেকশন দেওয়া যায় ।

  5. সংমিশ্রণ-ভিত্তিক প্রোগ্রামিংয়ের সুবিধা রয়েছে , অর্থাৎ সম্মিলিত প্যাটার্নের মতো এমনভাবে কাজ করা ।

  6. রচনা তত্ক্ষণাত একটি ইন্টারফেসে প্রোগ্রামিং অনুসরণ করে ।

  7. রচনা সহজ একাধিক উত্তরাধিকার সুবিধা আছে

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


34

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

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

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

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

উত্তরাধিকার হ'ল একটি দুর্দান্ত বৈশিষ্ট্য, তবে আমি ভয় করি যে এটি গত কয়েক বছর ধরে অতিরিক্ত ব্যবহৃত হয়েছে। লোকেরা উত্তরাধিকারকে এক হাতুড়ি হিসাবে বিবেচনা করে যা এটিকে পেরেক দিতে পারে, যদি তা আসলে পেরেক, স্ক্রু বা অন্য কিছু হতে পারে।


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

25

আমার থাম্বের সাধারণ নিয়ম: উত্তরাধিকার ব্যবহারের আগে বিবেচনা করুন যদি রচনাটি আরও অর্থবোধ করে।

কারণ: সাবক্লাসিংয়ের অর্থ সাধারণত আরও জটিলতা এবং সংযুক্তি, অর্থাত্ ভুল না করে পরিবর্তন করা, বজায় রাখা এবং স্কেল করা শক্ত।

সূর্যের টিম বউদ্রেউর থেকে আরও অনেক সম্পূর্ণ এবং দৃ answer় উত্তর :

উত্তরাধিকারের ব্যবহারের সাধারণ সমস্যাগুলি যেমনটি দেখছি তা হ'ল:

  • নিরীহ কাজগুলি অপ্রত্যাশিত ফলাফল পেতে পারে - এর সর্বোত্তম ক্লাসিক উদাহরণটি সুপারক্লাস নির্মাণকারীর কাছ থেকে ওভারডেবল পদ্ধতিতে কল করা হয়, সাবক্লাস উদাহরণ ক্ষেত্রগুলির সূচনা করার আগে। নিখুঁত বিশ্বে কেউ কখনও তা করতে পারে না। এটি নিখুঁত বিশ্ব নয়।
  • এটি সাবক্ল্যাসারদের জন্য পদ্ধতি কলগুলির ক্রম এবং যেমন সম্পর্কে অনুমান করার জন্য বিকৃত প্রলোভন সরবরাহ করে - সুপারক্লাস সময়ের সাথে সাথে যদি বিকশিত হতে পারে তবে এই ধরনের অনুমানগুলি স্থিতিশীল হতে পারে না। আরও দেখুন আমার টোস্ট করার বৈদু্যতিক যন্ত্র ও কফি পাত্র উপমা
  • ক্লাসগুলি ভারী হয়ে যায় - আপনি অগত্যা জানেন না যে আপনার সুপারক্লাস এর নির্মাতায় কী কাজ করছে বা এটি কত স্মৃতি ব্যবহার করছে। সুতরাং কিছু নিরীহ-হালকা ওজনের জিনিস তৈরি করা আপনার ভাবার চেয়ে অনেক বেশি ব্যয়বহুল হতে পারে এবং সুপারক্লাসটি বিকশিত হলে সময়ের সাথে এটি পরিবর্তিত হতে পারে
  • এটি সাবক্লাসের একটি বিস্ফোরণকে উত্সাহ দেয় । শ্রেণিবদ্ধকরণের জন্য সময় ব্যয় হয়, আরও ক্লাসের জন্য মেমরির খরচ হয়। আপনি নেটবিয়ানদের স্কেল সম্পর্কিত কোনও অ্যাপ্লিকেশনটি না করা পর্যন্ত এটি একটি নন-ইস্যু হতে পারে, তবে সেখানে আমাদের আসল সমস্যা ছিল, উদাহরণস্বরূপ, মেনুগুলি ধীর হচ্ছে কারণ মেনুটির প্রথম প্রদর্শনটি বিশাল শ্রেণীর লোডকে ট্রিগার করেছিল। আমরা আরও ঘোষিত সিনট্যাক্স এবং অন্যান্য কৌশলগুলিতে সরিয়ে এটি ঠিক করেছি, তবে সেই ব্যয়টিও ঠিক করার জন্য।
  • বিষয়গুলি পরে পরিবর্তন করা আরও শক্ত করে তোলে - যদি আপনি কোনও শ্রেণি পাবলিক করেন তবে সুপারক্লাসের অদলবদলটি সাবক্লাসগুলি ভেঙে ফেলতে পারে - এটি এমন একটি পছন্দ যা আপনি একবার কোডটি প্রকাশ করার পরে আপনার সাথে বিবাহবন্ধনে আবদ্ধ হন। সুতরাং যদি আপনি আপনার সুপারক্লাসে প্রকৃত কার্যকারিতা পরিবর্তন না করে থাকেন তবে আপনার প্রয়োজনীয় জিনিসটি প্রসারিত করার পরিবর্তে আপনি পরে যদি জিনিসগুলি ব্যবহার করেন তবে জিনিসগুলি পরিবর্তনের জন্য আরও অনেক স্বাধীনতা পাবেন। উদাহরণস্বরূপ, জেপানেলকে সাবক্লাসিং করুন - এটি সাধারণত ভুল হয়; এবং যদি সাবক্লাসটি কোথাও সর্বজনীন হয়, আপনি কখনই সেই সিদ্ধান্তটি পুনর্বিবেচনার সুযোগ পাবেন না। যদি এটি জেকম্পোনেন্ট getThePanel () হিসাবে অ্যাক্সেস করা থাকে তবে আপনি এখনও এটি করতে পারেন (ইঙ্গিত: আপনার API হিসাবে উপাদানগুলির জন্য মডেল প্রকাশ করুন)।
  • অবজেক্ট হায়ারারচিগুলি স্কেল করে না (বা পরে তাদের স্কেল তৈরি করা সামনের পরিকল্পনার চেয়ে অনেক শক্ত) - এটি ক্লাসিক "অনেকগুলি স্তর" সমস্যা। আমি নীচে এটিতে যাব, এবং কীভাবে AskOOracle প্যাটার্ন এটি সমাধান করতে পারে (যদিও এটি OOP পিউরিস্টদের ক্ষতি করতে পারে)।

...

আমার করণীয়, আপনি যদি উত্তরাধিকারের জন্য অনুমতি দেন তবে লবণের দানা দিয়ে যা নিতে পারেন তা হ'ল:

  • ধ্রুবক ছাড়া আর কোনও ক্ষেত্র উন্মুক্ত করবেন না
  • পদ্ধতিগুলি বিমূর্ত বা চূড়ান্ত হবে
  • সুপারক্লাস নির্মাণকারীর কাছ থেকে কোনও পদ্ধতি কল করবেন না

...

এই সমস্তগুলি বড় প্রকল্পগুলির চেয়ে ছোট প্রকল্পগুলিতে কম এবং জনসাধারণের চেয়ে ব্যক্তিগত ক্লাসে কম প্রযোজ্য


25

উত্তরাধিকারের চেয়ে রচনা কেন পছন্দ করবেন?

অন্যান্য উত্তর দেখুন।

কখন আপনি উত্তরাধিকার ব্যবহার করতে পারেন?

এটি প্রায়শই বলা হয় যে কোনও শ্রেণি একটি শ্রেণীর Barউত্তরাধিকারী হতে পারে Fooযখন নিম্নলিখিত বাক্যটি সত্য হয়:

  1. একটি বার একটি foo হয়

দুর্ভাগ্যক্রমে, একমাত্র উপরের পরীক্ষাটি নির্ভরযোগ্য নয়। পরিবর্তে নিম্নলিখিত ব্যবহার করুন:

  1. একটি বার একটি foo, এবং
  2. বারগুলি foos যা করতে পারে তা করতে পারে।

প্রথম টেস্টে নিশ্চিত যে সব getters এর Fooমধ্যে জানার Bar(= ভাগ বৈশিষ্ট্য), এবং দ্বিতীয় টেস্ট নিশ্চিত করে তোলে যে সব setters এর Fooমধ্যে জানার Bar(= ভাগ কার্যকারিতা)।

উদাহরণ 1: কুকুর -> প্রাণী

একটি কুকুর একটি প্রাণী এবং কুকুররা প্রাণী যা করতে পারে তা করতে পারে (যেমন শ্বাস নেওয়া, মারা যাওয়া ইত্যাদি)। অতএব, শ্রেণি শ্রেণীর উত্তরাধিকারী Dog হতে পারেAnimal

উদাহরণ 2: বৃত্ত - / -> উপবৃত্ত

একটি চেনাশোনা একটি উপবৃত্ত হয় তবে উপবৃত্তগুলি করতে পারে এমন সমস্ত কিছুই চেনাশোনাগুলি করতে পারে না। উদাহরণস্বরূপ, চেনাশোনাগুলি প্রসারিত করতে পারে না, তবে উপবৃত্তগুলি পারে। সুতরাং, শ্রেণি শ্রেণীর উত্তরাধিকারী Circle হতে পারে নাEllipse

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

আপনার উত্তরাধিকার কখন ব্যবহার করা উচিত?

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

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

লিসকভ সাবস্টিটিউশন নীতি

ঠিক তেমনি আপনি জানেন, উত্তরাধিকার সম্ভব কিনা তা নির্ধারণের জন্য ব্যবহৃত অন্য একটি পদ্ধতির নাম লিসকভ সাবস্টিটিউশন নীতি :

বেস ক্লাসে পয়েন্টার বা রেফারেন্স ব্যবহার করে এমন ফাংশনগুলি অজান্তেই উত্পন্ন ক্লাসের অবজেক্টগুলি ব্যবহার করতে সক্ষম হতে হবে

মূলত, এর অর্থ হ'ল উত্তরাধিকার সম্ভব যদি বেস ক্লাসটি বহুত্বভাবে ব্যবহার করা যায়, যা আমি বিশ্বাস করি আমাদের পরীক্ষার সমতুল্য "একটি বার একটি ফু এবং বারগুলি foos যা করতে পারে সবকিছু করতে পারে"।


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

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

1
@ ফজিলজিক এবং আপনি যদি কৌতূহলী হয়ে থাকেন যে আমি সার্কেল-উপবৃত্তের সুনির্দিষ্ট মামলার পক্ষে কী পক্ষে কথা বলব: আমি বৃত্ত শ্রেণি প্রয়োগ না করার পক্ষে পরামর্শ দেব। সম্পর্কের বিপরীতকরণের বিষয়টি হ'ল এটি এলএসপি লঙ্ঘন করে: ফাংশনটি কল্পনা করুন computeArea(Circle* c) { return pi * square(c->radius()); }। একটি উপবৃত্ত (ব্যাসার্ধ () এমনকি এর অর্থ কি?) পাস করলে এটি স্পষ্টতই ভেঙে যায়। একটি উপবৃত্ত একটি চেনাশোনা নয় এবং যেমন বৃত্ত থেকে নেওয়া উচিত নয়।
বরিস ডালস্টাইন

computeArea(Circle *c) { return pi * width * height / 4.0; }এখন এটি জেনেরিক।
অদ্ভুত যুক্তি

2
@ ফজিলজিক আমি দ্বিমত পোষণ করছি: আপনি বুঝতে পেরেছেন যে এর অর্থ ক্লাস সার্কেলটি উত্পন্ন শ্রেণি উপবৃত্তির অস্তিত্বের প্রত্যাশা করেছিল, এবং তাই সরবরাহ করা হয়েছে width()এবং height()? এখন যদি কোনও লাইব্রেরি ব্যবহারকারী "ডিমের শেপ" নামে আরও একটি ক্লাস তৈরি করার সিদ্ধান্ত নেন? এটিও "বৃত্ত" থেকে উদ্ভূত হওয়া উচিত? অবশ্যই না. ডিমের আকার কোনও বৃত্ত নয়, এবং উপবৃত্তটিও একটি বৃত্ত নয়, সুতরাং এলএসপি ভেঙে যাওয়ার কারণে কোনওটিই বৃত্ত থেকে নেওয়া উচিত নয়। চেনাশোনা * শ্রেণিতে ক্রিয়াকলাপ করার পদ্ধতিগুলি একটি চেনাশোনা কী তা সম্পর্কে দৃ ass় ধারণা তৈরি করে এবং এই অনুমানগুলি ভেঙে প্রায় অবশ্যই বাগগুলি নিয়ে যায়।
বরিস ডালস্টেইন

19

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


15

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

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

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

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


3
এটা লক্ষণীয় যে উত্তরাধিকার পলিমারফিজম অর্জনের একমাত্র উপায় নয়। ডেকোরেটর প্যাটার্নটি কম্পোজিশনের মাধ্যমে পলিমারফিজমের উপস্থিতি সরবরাহ করে।
বিটমাস্ক 777

1
@ বিটম্যাস্ক 777: সাব টাইপ পলিমারফিজম হ'ল এক ধরণের পলিমারফিজম, অন্যটি হবে প্যারামেট্রিক পলিমারফিজম, এর জন্য আপনার উত্তরাধিকারের দরকার নেই। আরও গুরুত্বপূর্ণ বিষয়: উত্তরাধিকার সম্পর্কে কথা বলার সময় একটির অর্থ শ্রেণীর উত্তরাধিকার; .ie আপনি একাধিক ক্লাসের জন্য একটি সাধারণ ইন্টারফেস রেখে সাব টাইপ পলিমারফিজম পেতে পারেন এবং উত্তরাধিকারের সমস্যাগুলি পান না।
উদাগা

2
@ এঙ্গাগা: আমি আপনার মন্তব্যটি Inheritance is sometimes useful... That way you can have polymorphismউত্তরাধিকার এবং বহুবর্ষের ধারণার সাথে সংযোগ স্থাপন হিসাবে ব্যাখ্যা করেছি (প্রসঙ্গটি বিবেচনা করে অনুমান করা হয়)। আমার মন্তব্যটি আপনার মন্তব্যে আপনি কী স্পষ্ট করেছেন তা নির্দেশ করার উদ্দেশ্যে ছিল: পলিমারফিজম বাস্তবায়নের একমাত্র উপায়ই উত্তরাধিকার নয় এবং রচনা এবং উত্তরাধিকারের মধ্যে সিদ্ধান্ত নেওয়ার সময় বাস্তবে নির্ধারক কারণ নয়।
বিটমাস্ক 777

15

ধরুন একটি বিমানের কেবল দুটি অংশ রয়েছে: একটি ইঞ্জিন এবং ডানা।
তারপরে বিমানের ক্লাস ডিজাইনের দুটি উপায় রয়েছে।

Class Aircraft extends Engine{
  var wings;
}

এখন আপনার বিমানগুলি স্থির ডানাগুলি দিয়ে শুরু করতে
এবং এটিকে ফ্লাইটে রোটারি ডানাতে পরিবর্তন করতে পারে। এটি মূলত ডানাযুক্ত
একটি ইঞ্জিন। তবে আমি যদি পরিবর্তন করতে চাই
উড়ানের ইঞ্জিনটিও করতে ?

হয় বেস ক্লাসে Engineকোনও মিউটরকে এর
বৈশিষ্ট্য পরিবর্তন করার জন্য উন্মুক্ত করে, অথবা আমি এই রূপে আবার ডিজাইন করি Aircraft:

Class Aircraft {
  var wings;
  var engine;
}

এখন, আমি ফ্লাইতে আমার ইঞ্জিনও প্রতিস্থাপন করতে পারি।


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

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


7

আপনি যখন "কপি" / বেস ক্লাসের 'এপিআই প্রকাশ করতে চান, আপনি উত্তরাধিকার ব্যবহার করেন। যখন আপনি কেবল কার্যকারিতা "অনুলিপি" করতে চান, প্রতিনিধি ব্যবহার করুন।

এর একটি উদাহরণ: আপনি একটি তালিকা থেকে একটি স্ট্যাক তৈরি করতে চান। স্ট্যাকের কেবল পপ, ধাক্কা এবং উঁকি দেওয়া আছে। আপনি স্ট্যাকের মধ্যে পুশ_ব্যাক, পুশ_ফ্রন্ট, রিমুভএট, এবং এ জাতীয় কার্যকারিতা চান না এমন উত্তরাধিকার ব্যবহার করা উচিত নয়।


7

এই দুটি উপায় একসাথে ঠিক থাকতে পারে এবং একে অপরকে সমর্থন করে।

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

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

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

কেন?

কারণ উত্তরাধিকার হ'ল তথ্য সঞ্চার করার একটি দুর্বল উপায়

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

উত্তরাধিকার ব্যবহারের জন্য তিনটি বাস্তব কারণ সম্পর্কে আমি ভাবতে পারি:

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

এগুলি যদি সত্য হয়, তবে সম্ভবত উত্তরাধিকার ব্যবহার করা দরকার।

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

কারণটি 2 নম্বর হলে এটি কিছুটা জটিল হয়ে ওঠে। আপনার কি কেবল একই বেস ক্লাসটি ব্যবহার করা দরকার? সাধারণভাবে, কেবল একই বেস ক্লাসটি ব্যবহার করা যথেষ্ট ভাল নয় তবে এটি আপনার কাঠামোর প্রয়োজন হতে পারে, একটি নকশা বিবেচনা যা এড়ানো যায় না।

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


7

নতুন প্রোগ্রামারদের জন্য এই দৃষ্টিকোণটি আলাদা দৃষ্টিকোণ থেকে সমাধান করার জন্য:

যখন আমরা অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং শিখি তখন উত্তরাধিকার সূচনা প্রায়ই শিখানো হয়, তাই এটি একটি সাধারণ সমস্যার সহজ সমাধান হিসাবে দেখা হয়।

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

এটি দুর্দান্ত শোনায়, তবে বাস্তবে এটি বেশিরভাগ ক্ষেত্রে এক কারণে প্রায়শই কখনও কাজ করে না:

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

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

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

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

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


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

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

6

এর বাইরে / এর বিবেচনা রয়েছে, আপনার অবজেক্টের উত্তরাধিকারের "গভীরতা" বিবেচনা করতে হবে। উত্তরাধিকারের পাঁচ বা ছয় স্তরের বেশি কিছু অপ্রত্যাশিত ingালাই এবং বক্সিং / আনবক্সিং সমস্যার কারণ হতে পারে এবং সেই ক্ষেত্রে এর পরিবর্তে আপনার অবজেক্টটি রচনা করা বুদ্ধিমানের কাজ হতে পারে।


6

যখন আপনি একটি -একটি হল দুটি ক্লাস (উদাহরণস্বরূপ কুকুর একটি কুকুরের হয়) মধ্যে সম্পর্ক, আপনি উত্তরাধিকার জন্য যান।

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


আপনি বলেছেন উত্তরাধিকার এবং উত্তরাধিকার। আপনি কি উত্তরাধিকার এবং রচনা বোঝাতে চাইছেন না?
ট্রেভোরকির্কবি

না, আপনি না। আপনি ঠিক পাশাপাশি কাইনাইন ইন্টারফেসটি সংজ্ঞায়িত করতে পারেন এবং প্রতিটি কুকুর এটি প্রয়োগ করতে দেয় এবং আপনি আরও সোলিড কোড দিয়ে শেষ করতে পারেন।
মার্কাস

5

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

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


ইন্টারফেস উল্লেখ করার জন্য +1। আমি প্রায়শই বিদ্যমান ক্লাসগুলি আড়াল করতে এবং কম্পোজিশনের জন্য ব্যবহৃত অবজেক্টটি উপহাস করে আমার নতুন ক্লাসটিকে যথাযথভাবে ইউনিট টেস্টযোগ্য করে তুলতে এই পদ্ধতির ব্যবহার করি। এটির পরিবর্তে প্রার্থীর পিতামাতার ক্লাসটি পাস করার জন্য এটি নতুন সামগ্রীর মালিকের প্রয়োজন।
কেল


4

আমি @ পাভেলের সাথে একমত, যখন তিনি বলেছেন, রচনার জন্য জায়গা আছে এবং উত্তরাধিকারের জন্য জায়গা রয়েছে।

আমি মনে করি উত্তরাধিকার ব্যবহার করা উচিত যদি আপনার উত্তর এই প্রশ্নের যে কোনও একটিতে সত্যিকই হয়।

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

তবে, যদি আপনার উদ্দেশ্যটি নিখুঁতভাবে কোড পুনরায় ব্যবহারের হয় তবে কমপোজিশনটি সম্ভবত আরও ভাল ডিজাইনের পছন্দ।


4

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

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

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

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

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

class List {
  data = new Array();

  Integer size() {
    return data.length;
  }

  add(Integer anInteger) {
    data[data.length] = anInteger;
  }
}

তারপরে, আমি পূর্ণসংখ্যার তালিকার একটি সাবক্লাস হিসাবে পূর্ণসংখ্যার সেট লিখি:

class Set, inheriting from: List {
  add(Integer anInteger) {
     if (data.notContains(anInteger)) {
       super.add(anInteger);
     }
  }
}

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

উত্তরাধিকারের অনুপযুক্ত ব্যবহারের এটি সর্বোত্তম উদাহরণ। এই ক্ষেত্রে রচনা ব্যবহার করুন।

(এর একটি খণ্ড: উত্তরাধিকার সঠিকভাবে ব্যবহার করুন )।


3

আমি শুনেছি থাম্বের একটি নিয়ম হ'ল উত্তরাধিকার যখন একটি "হ'ল-এ" হয় তখন সম্পর্ক এবং রচনা তৈরি করা উচিত। এমনকি এটির সাথেও আমি অনুভব করি যে আপনার সবসময় সংমিশ্রণের দিকে ঝুঁকতে হবে কারণ এটি প্রচুর জটিলতা দূর করে।


2

রচনা v / s উত্তরাধিকার বিস্তৃত বিষয় subject এর চেয়ে ভাল কিসের সত্যিকারের কোনও উত্তর নেই কারণ আমি মনে করি এটি সবই সিস্টেমের ডিজাইনের উপর নির্ভর করে।

সাধারণত বস্তুর মধ্যে সম্পর্কের ধরণগুলির মধ্যে একটি চয়ন করার জন্য আরও ভাল তথ্য সরবরাহ করে।

যদি সম্পর্কের ধরণটি "আইএস-এ" সম্পর্ক হয় তবে উত্তরাধিকার হ'ল উত্তম পদ্ধতির। অন্যথায় সম্পর্কের ধরণটি "এইচএএস-এ" সম্পর্কিত হয় তবে রচনাটি আরও ভালভাবে এগিয়ে আসবে।

এটি সম্পূর্ণরূপে সত্তার সম্পর্কের উপর নির্ভর করে।


2

যদিও রচনা পছন্দ করা হয়, আমি অনুকূল হাইলাইট করতে চাই উত্তরাধিকার এবং কনস রচনা

উত্তরাধিকার পেশাদার:

  1. এটি একটি যৌক্তিক " আইএস এ" সম্পর্ক স্থাপন করে। তাহলে গাড়ি এবং ট্রাক দুই ধরনের হয় যানবাহন (বেস বর্গ), শিশু শ্রেণী একটা IS বেস বর্গ।

    অর্থাত

    গাড়ি একটি যানবাহন

    ট্রাক একটি যানবাহন

  2. উত্তরাধিকারের সাথে, আপনি একটি সক্ষমতা সংজ্ঞা / পরিবর্তন / প্রসারিত করতে পারেন

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

রচনা সংক্রান্ত ধারণা:

  1. উত্তরাধিকার সূত্রে সাবক্লাসটি বেস শ্রেণীর পদ্ধতিটি সরাসরিভাবে আবেদন করতে পারে যদিও এটি আইএস এ সম্পর্কের কারণে বেস শ্রেণির পদ্ধতিটি বাস্তবায়ন করে না । আপনি যদি রচনাটি ব্যবহার করেন তবে ধারণকৃত ক্লাসের API প্রকাশ করতে আপনাকে ধারক শ্রেণিতে পদ্ধতি যুক্ত করতে হবে

যেমন যদি গাড়ি রয়েছে যানবাহন এবং আপনার মূল্যের পেতে আছে যদি গাড়ি , যা সংজ্ঞায়িত করা হয়েছে যানবাহন , আপনার কোডটির এই কেমন হবে

class Vehicle{
     protected double getPrice(){
          // return price
     }
} 

class Car{
     Vehicle vehicle;
     protected double getPrice(){
          return vehicle.getPrice();
     }
} 

আমি মনে করি এটি প্রশ্নের উত্তর দেয় না
almanegra

আপনি ওপি প্রশ্নটি আবার দেখতে পারেন। আমি সম্বোধন করেছি: প্রতিটি পদ্ধতির জন্য কি কি বাণিজ্য বন্ধ রয়েছে?
রবীন্দ্র বাবু

যেমনটি আপনি উল্লেখ করেছেন, আপনি কেবল "উত্তরাধিকারের রচনা এবং রচনা বিষয়ক বিষয়গুলি" সম্পর্কে কথা বলছেন, এবং প্রতিটি পদ্ধতির জন্য
ট্রেড অফ

উত্তরাধিকার সূত্রগুলি হ'ল উত্তরাধিকারের দিক থেকে রচনা এবং মিশ্রণটি উত্তরাধিকারের দিক থেকে কার্যকর।
রবীন্দ্র বাবু

1

অনেক লোক যেমন বলেছিল, আমি প্রথমে চেকটি দিয়ে শুরু করব - "ইস-এ" সম্পর্ক আছে কিনা। এটি উপস্থিত থাকলে আমি সাধারণত নিম্নলিখিতগুলি পরীক্ষা করে দেখি:

বেস ক্লাস ইনস্ট্যান্ট করা যায় কিনা। অর্থাৎ বেস ক্লাসটি নন-অ্যাবস্ট্রাক্ট হতে পারে কিনা। যদি এটি অ-বিমূর্ত হতে পারে তবে আমি সাধারণত রচনা পছন্দ করি

উদাঃ 1. হিসাবরক্ষক একজন কর্মচারী। তবে আমি করব না উত্তরাধিকার ব্যবহার কারণ কোনও কর্মচারী বস্তু তাত্ক্ষণিকভাবে চালু করা যেতে পারে।

উদাহরণস্বরূপ 2. বই একটি বিক্রয় আইটেম। একটি সেলিং আইটেম ইনস্ট্যান্ট করা যায় না - এটি বিমূর্ত ধারণা। সুতরাং আমি উত্তরাধিকারী ব্যবহার করব। সেলিংআইটম একটি বিমূর্ত বেস ক্লাস (বা ইন্টারফেস) সি # তে )

আপনি এই পদ্ধতির সম্পর্কে কি মনে করেন?

এছাড়াও, আমি উত্তর উত্তরকে সমর্থন করি কেন উত্তরাধিকার আদৌ ব্যবহার করবেন?

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

@MatthieuM। /software/12439/code-smell-inheritance-abuse/12448#comment303759_12448 এ বলেছেন

উত্তরাধিকারের বিষয়টি হ'ল এটি দুটি অर्थোগোনাল উদ্দেশ্যে ব্যবহার করা যেতে পারে:

ইন্টারফেস (বহুবিজ্ঞানের জন্য)

বাস্তবায়ন (কোড পুনরায় ব্যবহারের জন্য)

REFERENCE,

  1. কোন ক্লাস ডিজাইন ভাল?
  2. উত্তরাধিকার বনাম সমষ্টি

1
আমি নিশ্চিত না কেন 'বেস ক্লাসটি বিমূর্ত?' আলোচনার পরিসংখ্যান .. এলএসপি: পোডল অবজেক্টগুলিতে পাস করা থাকলে কুকুরগুলিতে পরিচালিত সমস্ত ফাংশন কি কাজ করবে? যদি হ্যাঁ, তবে পোডল কুকুরের পরিবর্তে প্রতিস্থাপিত হতে পারে এবং তাই কুকুরের কাছ থেকে উত্তরাধিকারী হতে পারে।
গিশু

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

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

@ গিশু ধন্যবাদ তবে, আপনি যদি ব্যাঙ্ক ডোমেন, এইচআর ডোমেন, খুচরা ডোমেন বা অন্য কোনও জনপ্রিয় ডোমেনের উপর ভিত্তি করে কোনও দৃশ্য সরবরাহ করতে পারেন তবে এটি আরও সহায়ক হবে more
LCJ

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

1

আমি দেখতে পাচ্ছি না যে কেউ হীরা সমস্যার উল্লেখ করেছে , যা উত্তরাধিকার নিয়ে উত্থাপিত হতে পারে।

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

উইকিপিডিয়া এই প্রশ্নে আলোচিত বিষয়টির একটি সুন্দর ওভারভিউ সরবরাহ করে।


1
ডি বি এবং সি এর উত্তরাধিকার সূত্রে এ। না হয় যদি তা হয় তবে এটি এক্স ক্লাস এ
এক্সপ্লোরেশন

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

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