c# - একটি বিমূর্ত ফাংশন এবং একটি ভার্চুয়াল ফাংশন মধ্যে পার্থক্য কি?




oop programming-languages (16)

একটি বিমূর্ত ফাংশন এবং একটি ভার্চুয়াল ফাংশন মধ্যে পার্থক্য কি? কোন ক্ষেত্রে এটি ভার্চুয়াল বা বিমূর্ত ব্যবহার করার সুপারিশ করা হয়? কোনটি সর্বোত্তম পদ্ধতির?


  1. শুধুমাত্র abstract ক্লাস abstract সদস্য থাকতে পারে।
  2. একটি abstract শ্রেণী থেকে উত্তরাধিকারী একটি অ- abstract শ্রেণী অবশ্যই তার abstract সদস্যগুলিকে override করতে হবে
  3. একটি abstract সদস্য implicitly virtual
  4. একটি abstract সদস্য কোন বাস্তবায়ন সরবরাহ করতে পারে না ( abstract কিছু কিছু ভাষায় pure virtual বলা হয়)।

C # এ কোনও ভার্চুয়াল ক্লাস কল নেই।

ফাংশন জন্য

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

আপনি আপনার প্রয়োজন সঙ্গে সিদ্ধান্ত নিতে পারেন।


আপনি সর্বদা একটি বিমূর্ত ফাংশন override আবশ্যক।

এভাবে:

  • সারাংশ ফাংশন - উত্তরাধিকারী তার নিজস্ব বাস্তবায়ন প্রদান করা আবশ্যক
  • ভার্চুয়াল - যখন এটি উত্তরাধিকারী সিদ্ধান্ত নিতে হয়

আমার বোঝার জন্য:

সারাংশ পদ্ধতি:

শুধুমাত্র বিমূর্ত শ্রেণী বিমূর্ত পদ্ধতি রাখা যাবে। এছাড়াও প্রাপ্ত শ্রেণির পদ্ধতিটি বাস্তবায়ন করতে হবে এবং ক্লাসে কোন বাস্তবায়ন সরবরাহ করা হবে না।

ভার্চুয়াল পদ্ধতি:

একটি শ্রেণী এই ঘোষণা করতে পারে এবং একই বাস্তবায়ন প্রদান করতে পারেন। এছাড়াও derived ক্লাস এটি override পদ্ধতি বাস্তবায়ন প্রয়োজন।


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


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

সহজ ব্যাখ্যা - উপমা ব্যবহার করে ব্যাখ্যা

বিমূর্ত পদ্ধতি

জর্জ ডব্লু বুশ মনে। তিনি তার সৈন্যদের বলেন: "ইরাক যুদ্ধ যুদ্ধ"। এবং এটাই. তিনি নির্দিষ্ট করেছেন যে যুদ্ধ করা আবশ্যক। তিনি ঠিক কিভাবে ঘটবে তা নির্দিষ্ট করে না। কিন্তু আমি বলতে চাচ্ছি, আপনি শুধু বাইরে যেতে এবং "যুদ্ধ" করতে পারেন না: এর মানে কি ঠিক? আমি কি বি -২5 বা আমার ডারিংগারের সাথে যুদ্ধ করি? যে নির্দিষ্ট বিবরণ অন্য কেউ বাকি আছে। এটি একটি বিমূর্ত পদ্ধতি।

ভার্চুয়াল পদ্ধতি

ডেভিড Petraeus সেনাবাহিনী উচ্চ আপ হয়। তিনি কি যুদ্ধ মানে সংজ্ঞায়িত করেছেন:

  1. শত্রু খুঁজুন
  2. তাকে নিরপেক্ষ করা।
  3. পরে একটি বিয়ার আছে

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

বেসরকারি কাজের ব্লগসগুলি পেট্রোয়াসের আদেশটি পড়ে এবং তার বিশেষ প্রয়োজনীয়তা অনুযায়ী যুদ্ধের নিজস্ব সংস্করণ বাস্তবায়নের অনুমতি দেয়:

  1. শত্রু খুঁজুন।
  2. মাথা তাকে অঙ্কুর।
  3. বাড়িতে যেতে
  4. বিয়ার আছে।

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

  1. শত্রু খুঁজুন।
  2. তাকে কিছু বিএস ট্রাম্প আপ চার্জ দিয়ে গ্রেপ্তার করা হয়েছে।
  3. বাড়িতে যেতে
  4. বিয়ার আছে।

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

দুই মধ্যে পার্থক্য

  • জর্জ বুশ কোন বাস্তবায়ন বিবরণ প্রমাণ করে না। এই অন্য কেউ দ্বারা প্রদান করা আবশ্যক। এটি একটি বিমূর্ত পদ্ধতি।

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

আশা করি এইটি কাজ করবে.


একটি বিমূর্ত ফাংশন একটি বাস্তবায়ন ছাড়া, "শুধু" একটি স্বাক্ষর। ক্লাসটি কিভাবে ব্যবহার করা যায় তা ঘোষণা করার জন্য এটি একটি ইন্টারফেসে ব্যবহৃত হয়। এটা derived ক্লাস এক প্রয়োগ করা আবশ্যক।

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

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


একটি বিমূর্ত ফাংশনটির কোন বাস্তবায়ন নেই এবং এটি কেবল একটি বিমূর্ত শ্রেণীতে ঘোষণা করা যেতে পারে। এই derived বর্গ একটি বাস্তবায়ন প্রদান বাহিনী। একটি ভার্চুয়াল ফাংশন ডিফল্ট বাস্তবায়ন সরবরাহ করে এবং এটি একটি বিমূর্ত শ্রেণী বা একটি অ-বিমূর্ত শ্রেণীতে বিদ্যমান থাকতে পারে। তাই উদাহরণস্বরূপ:

public abstract class myBase
{
    //If you derive from this class you must implement this method. notice we have no method body here either
    public abstract void YouMustImplement();

    //If you derive from this class you can change the behavior but are not required to
    public virtual void YouCanOverride()
    { 
    }
}

public class MyBase
{
   //This will not compile because you cannot have an abstract method in a non-abstract class
    public abstract void YouMustImplement();
}

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

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

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

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


বিমূর্ত ফাংশন (পদ্ধতি):

● একটি বিমূর্ত পদ্ধতি একটি পদ্ধতি যা শব্দ বিমূর্ত সঙ্গে ঘোষণা করা হয়।

● এটি শরীর নেই।

● এটি প্রাপ্ত শ্রেণীর দ্বারা প্রয়োগ করা উচিত।

● যদি কোন পদ্ধতি বিমূর্ত হয় তবে বর্গটি বিমূর্ত হওয়া উচিত।

ভার্চুয়াল ফাংশন (পদ্ধতি):

● একটি ভার্চুয়াল পদ্ধতিটি এমন কী পদ্ধতি যা কীওয়ার্ড ভার্চুয়াল দিয়ে ঘোষণা করা হয় এবং এটি ওভাররাইড কীওয়ার্ড ব্যবহার করে ডেরিভেড শ্রেণির পদ্ধতি দ্বারা ওভাররাইড করা যেতে পারে।

● এটি ওভাররাইড করা হোক না কেন প্রাপ্ত হওয়া শ্রেণির উপরে।


যখন আপনি উত্তরাধিকারীদের কার্যকারিতা প্রসারিত করতে চান তবে আপনি মূলত একটি ভার্চুয়াল পদ্ধতি ব্যবহার করেন।

আপনি উত্তরাধিকারীদের কার্যকারিতা বাস্তবায়ন করতে চান যখন আপনি বিমূর্ত পদ্ধতি ব্যবহার (এবং এই ক্ষেত্রে তাদের কোন পছন্দ নেই)


সাধারণ বস্তু ভিত্তিক ভিউ থেকে:

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

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

জেনারেল ওও এই দুটি ধারণার মধ্যে আলাদা কিছু দর্শন


সারাংশ পদ্ধতি সবসময় ভার্চুয়াল। তারা একটি বাস্তবায়ন করতে পারে না।

যে প্রধান পার্থক্য।

মূলত, আপনি যদি এটির 'ডিফল্ট' বাস্তবায়ন করেন এবং বংশবৃদ্ধিগুলিকে তার আচরণ পরিবর্তন করতে চান তবে আপনি একটি ভার্চুয়াল পদ্ধতি ব্যবহার করবেন।

একটি বিমূর্ত পদ্ধতি সঙ্গে, আপনি একটি বাস্তবায়ন প্রদান করতে বংশধরদের বাধ্য।


সারাংশ ফাংশন:

  1. এটা শুধুমাত্র বিমূর্ত শ্রেণীর মধ্যে ঘোষণা করা যেতে পারে।
  2. এটা বিমূর্ত শ্রেণী বাস্তবায়ন না শুধুমাত্র পদ্ধতি ঘোষণা রয়েছে।
  3. এটা derived বর্গ overridden করা আবশ্যক।

ভার্চুয়াল ফাংশন:

  1. এটা বিমূর্ত এবং অ বিমূর্ত শ্রেণীর মধ্যে ঘোষণা করা যেতে পারে।
  2. এটা পদ্ধতি বাস্তবায়ন রয়েছে।
  3. এটা overridden হতে পারে।

বাঁধাই কোড একটি ইউনিট একটি নাম ম্যাপিং প্রক্রিয়া।

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

এখন বিবেচনা করুন:

  • মানুষের তুলনায়, মেশিন অনুসন্ধান এবং সাজানোর এ সত্যিই ভাল
  • মেশিনের তুলনায়, মানুষ আবিষ্কার এবং উদ্ভাবন সত্যিই ভাল

সুতরাং, সংক্ষিপ্ত উত্তর হল: virtual মেশিন (রানটাইম) এর জন্য একটি দেরী নির্দেশনামূলক নির্দেশনা, যেখানে abstract মানব (প্রোগ্রামার)

অন্য কথায়, virtual মানে:

"প্রিয় রানটাইম , আপনি যা ভাল তা করে এই নামের উপযুক্ত কোডটি বাঁধুন: অনুসন্ধান "

যেখানে abstract অর্থ:

"প্রিয় প্রোগ্রামার , আপনি যা ভাল তা করে এই নামের উপযুক্ত কোডটি বাঁধুন: উদ্ভাবন করুন "

সম্পূরকতার জন্য, ওভারলোডিং মানে:

"প্রিয় কম্পাইলার , আপনি যা ভাল তা করে এই নামের উপযুক্ত কোডটি বাঁধুন: সাজানোর "।


ভার্চুয়াল পদ্ধতি :

  • ভার্চুয়াল মানে আমরা এটি ওভাররাইড করতে পারেন।

  • ভার্চুয়াল ফাংশন একটি বাস্তবায়ন আছে। আমরা ক্লাস উত্তরাধিকারী যখন আমরা ভার্চুয়াল ফাংশন ওভাররাইড এবং আমাদের নিজস্ব যুক্তি প্রদান করতে পারেন।

  • বাস্তবায়ন করার সময় আমরা ভার্চুয়াল ফাংশনের রিটার্ন টাইপ পরিবর্তন করতে পারি
    শিশু বর্গ মধ্যে ফাংশন (যা একটি ধারণা হিসাবে বলা যেতে পারে
    ছায়াকরণ)।

বিমূর্ত পদ্ধতি

  • সারাংশ মানে আমরা অবশ্যই ওভাররাইড করা আবশ্যক।

  • একটি বিমূর্ত ফাংশন কোন বাস্তবায়ন আছে এবং একটি বিমূর্ত বর্গ হতে হবে।

  • এটা শুধুমাত্র ঘোষণা করা যেতে পারে। এই derived বর্গ এটি বাস্তবায়ন প্রদান করে।

  • একটি বিমূর্ত সদস্য implicitly ভার্চুয়াল। বিমূর্ত কিছু ভাষার মধ্যে বিশুদ্ধ ভার্চুয়াল হিসাবে বলা যেতে পারে।

    public abstract class BaseClass
    { 
        protected abstract void xAbstractMethod();
    
        public virtual void xVirtualMethod()
        {
            var x = 3 + 4;
        }
    } 




virtual-functions