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


1578

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


271
একটি ভার্চুয়াল ফাংশন ওভাররাইড করার সময় একটি বিমূর্ত ফাংশনটি ওভাররাইড করতে হবে।
জর্ডান পারমার 14

15
ভার্চুয়াল ফাংশনগুলির বেস শ্রেণিতে একটি ডিফল্ট / জেনেরিক প্রয়োগ থাকতে পারে।
মার্টিন

5
এখানে মূল শব্দটি বিমূর্ত ; এগুলির অস্তিত্ব নেই এবং ফাংশনটি কী কী তা সম্পর্কে কেবল একটি অস্পষ্ট ধারণা (পদ্ধতি স্বাক্ষর)
কোল জনসন

উত্তর:


2734

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

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


396
এবং অবশ্যই, যদি আপনি একটি ভার্চুয়াল পদ্ধতি ওভাররাইড, আপনি সবসময় পিতা বা মাতা পদ্ধতি base.Foo (...) কল করে পাঠাতে পারেন
Brann

196
ধন্যবাদ। এটি এমএসডিএন ডকুমেন্টেশনের যে কোনও কিছুর চেয়ে অনেক ভাল এবং সহজ ব্যাখ্যা ((এটি পড়ার পাঁচ মিনিটের পরে আমার মাথা ব্যথা হয়েছিল: এমএসডিএন.এমক্রিফটিস / লেনস / লাইবারি / এএআই 645767(vvv..71 ) .aspx )
জেক

15
জাভা থেকে আসার পরে আমি কিছুটা বিচলিত হয়েছি কেন আমাদের এটিকে আদৌ ভার্চুয়াল তৈরি করা দরকার, যতক্ষণ না আমি এটি পড়েছি: stackoverflow.com/a/1062126/193634
রোসদি কাসিম

4
@ মেকডটনেট এর অর্থ আপনি যদি আমার প্রয়োগ পছন্দ করেন তবে আমাকে নিজের চেয়ে ভাল না লিখলে আমাকে ব্যবহার করুন :)
উসমান ইউনাস

16
এটি মাইক্রোসফ্ট রেফারেন্স লাইব্রেরিতে থাকা উচিত যা আমি 10 মিনিট পড়তে এবং এখনও বিভ্রান্ত করে কাটিয়েছি।
সামচেন

302

একটি বিমূর্ত ফাংশনটির কোন প্রয়োগ নেই এবং এটি কেবল একটি বিমূর্ত শ্রেণিতে ঘোষণা করা যেতে পারে। এটি উত্পন্ন শ্রেণিকে একটি বাস্তবায়ন সরবরাহ করতে বাধ্য করে।

ভার্চুয়াল ফাংশন একটি ডিফল্ট বাস্তবায়ন সরবরাহ করে এবং এটি কোনও বিমূর্ত শ্রেণি বা একটি নন-অ্যাবস্ট্রাক্ট শ্রেণিতে উপস্থিত থাকতে পারে।

উদাহরণস্বরূপ:

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();
}

28
নমুনা কোডটি দেখতে খুব দরকারী - উত্তরের বিভিন্ন ব্যাখ্যা আরও পরিষ্কার করতে সহায়তা করে।
সাইমন তেউসি

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

2
আপনার MyBaseক্লাসটি কি কোনওভাবে বিমূর্ত শ্রেণি প্রয়োগ করতে হবে না ? আমি প্রায়শই এটি করি না, তাই আমার ভুল হতে পারে। আমি আপনার উদাহরণে এটি দেখতে পাচ্ছি না।
jp2code

2
উপরের উদাহরণে মাইবেস আপনি যা করতে পারবেন না তা দেখাচ্ছে। এটি হ'ল আপনার কোনও অ-বিমূর্ত শ্রেণিতে বিমূর্ত পদ্ধতি থাকতে পারে না
জোশবার্ক

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

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

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

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

দয়া করে 4 পয়েন্টের জন্য সমর্থনকারী রেফারেন্স অন্তর্ভুক্ত করুন এবং আপনার পোস্টটি আগের কিছু ইতিমধ্যে দেয় নি এমন অন্য কিছু আনেনি।
রাফায়েল

এটি কেবল কোনও বিবৃতি ছাড়াই বিবৃতিগুলির একগুচ্ছ।
বিপরীতে ইঞ্জিনিয়ার করা হয়েছে

61

আপনাকে অবশ্যই সর্বদা একটি বিমূর্ত ফাংশন ওভাররাইড করতে হবে।

এভাবে:

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

37

বিমূর্ত ফাংশন:

  1. এটি কেবল বিমূর্ত শ্রেণীর মধ্যেই ঘোষণা করা যেতে পারে।
  2. এটিতে কেবল পদ্ধতির ঘোষণা রয়েছে যা বিমূর্ত শ্রেণিতে প্রয়োগ নয়।
  3. এটি অবশ্যই উত্পন্ন শ্রেণিতে ওভাররাইড করা উচিত।

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

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

29

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

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

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

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


29

ব্যাখ্যা: উপমা সহ। আশা করি এটি আপনাকে সাহায্য করবে।

প্রসঙ্গ

আমি একটি বিল্ডিংয়ের 21 তলায় কাজ করি। এবং আমি আগুন সম্পর্কে বেহায়া। প্রতিবার এবং পৃথিবীর কোথাও কোথাও একটি আকাশ আগুনে পোড়াচ্ছে sc তবে ভাগ্যক্রমে আমাদের এখানে কোথাও একটি নির্দেশিকা ম্যানুয়াল রয়েছে যাতে আগুন লাগলে কী করা উচিত:

অগ্নিতারণ পথ()

  1. জিনিসপত্র সংগ্রহ করবেন না
  2. আগুন পালাতে হাঁটা
  3. বিল্ডিংয়ের বাইরে হাঁটুন

এটি মূলত ফায়ারস্পেস () নামে একটি ভার্চুয়াল পদ্ধতি method

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

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

  1. উইন্ডো চালান
  2. জানালার বাইরে লাফিয়ে পড়ুন
  3. প্যারাসুটটি নীচে নিরাপদে

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

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

সমস্ত সংস্থা ভাল ছাঁটাই হয় না। কিছু সংস্থা ফায়ার ড্রিল করে না। তাদের সামগ্রিকভাবে পালানোর নীতি নেই। প্রতিটি মানুষ তার নিজের জন্য। পরিচালন কেবল বিদ্যমান নীতিতে আগ্রহী।

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

আবার দুজনের মধ্যে পার্থক্য কী?

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

এখন যে এত কঠিন ছিল না?


22

একটি বিমূর্ত পদ্ধতি একটি পদ্ধতি যা একটি কংক্রিট শ্রেণি তৈরি করতে প্রয়োগ করা আবশ্যক। ঘোষণাটি বিমূর্ত শ্রেণিতে রয়েছে (এবং কোনও বিমূর্ত পদ্ধতি সহ যে কোনও শ্রেণি অবশ্যই একটি বিমূর্ত শ্রেণি হতে হবে) এবং এটি অবশ্যই একটি কংক্রিট শ্রেণিতে প্রয়োগ করা উচিত।

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

নিম্নলিখিত উদাহরণটি দেখুন:

public class BaseClass
{
    public void SayHello()
    {
        Console.WriteLine("Hello");
    }


    public virtual void SayGoodbye()
    {
        Console.WriteLine("Goodbye");
    }

    public void HelloGoodbye()
    {
        this.SayHello();
        this.SayGoodbye();
    }
}


public class DerivedClass : BaseClass
{
    public new void SayHello()
    {
        Console.WriteLine("Hi There");
    }


    public override void SayGoodbye()
    {
        Console.WriteLine("See you later");
    }
}

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

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


9

বিমূর্ত পদ্ধতি সর্বদা ভার্চুয়াল। তাদের বাস্তবায়ন হতে পারে না।

এটিই মূল পার্থক্য।

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

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


9

নিম্নলিখিত ক্লাসগুলিতে (অন্যান্য উত্তরগুলি থেকে) কিছু উন্নতি করে আমি এটিকে আরও সহজ করেছি:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace TestOO
{
    class Program
    {
        static void Main(string[] args)
        {
            BaseClass _base = new BaseClass();
            Console.WriteLine("Calling virtual method directly");
            _base.SayHello();
            Console.WriteLine("Calling single method directly");
            _base.SayGoodbye();

            DerivedClass _derived = new DerivedClass();
            Console.WriteLine("Calling new method from derived class");
            _derived.SayHello();
            Console.WriteLine("Calling overrided method from derived class");
            _derived.SayGoodbye();

            DerivedClass2 _derived2 = new DerivedClass2();
            Console.WriteLine("Calling new method from derived2 class");
            _derived2.SayHello();
            Console.WriteLine("Calling overrided method from derived2 class");
            _derived2.SayGoodbye();
            Console.ReadLine();
        }
    }


    public class BaseClass
    {
        public void SayHello()
        {
            Console.WriteLine("Hello\n");
        }
        public virtual void SayGoodbye()
        {
            Console.WriteLine("Goodbye\n");
        }

        public void HelloGoodbye()
        {
            this.SayHello();
            this.SayGoodbye();
        }
    }


    public abstract class AbstractClass
    {
        public void SayHello()
        {
            Console.WriteLine("Hello\n");
        }


        //public virtual void SayGoodbye()
        //{
        //    Console.WriteLine("Goodbye\n");
        //}
        public abstract void SayGoodbye();
    }


    public class DerivedClass : BaseClass
    {
        public new void SayHello()
        {
            Console.WriteLine("Hi There");
        }

        public override void SayGoodbye()
        {
            Console.WriteLine("See you later");
        }
    }

    public class DerivedClass2 : AbstractClass
    {
        public new void SayHello()
        {
            Console.WriteLine("Hi There");
        }
        // We should use the override keyword with abstract types
        //public new void SayGoodbye()
        //{
        //    Console.WriteLine("See you later2");
        //}
        public override void SayGoodbye()
        {
            Console.WriteLine("See you later");
        }
    }
}

6

বাইন্ডিং হল কোডের এককে একটি নাম ম্যাপ করার প্রক্রিয়া।

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

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

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

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

অন্য কথায়, virtualঅর্থ:

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

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

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

সম্পূর্ণতার খাতিরে, ওভারলোডিং এর অর্থ:

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


3

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

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


3

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

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

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


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

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

  • অ্যাবস্ট্রাক্ট মানে আমরা এটিকে ওভাররাইড করতে হবে।

  • একটি বিমূর্ত ফাংশনটির কোন প্রয়োগ নেই এবং অবশ্যই এটি একটি বিমূর্ত শ্রেণিতে থাকতে হবে।

  • এটি কেবল ঘোষণা করা যেতে পারে। এটি উদ্ভূত শ্রেণিকে এটির বাস্তবায়ন সরবরাহ করতে বাধ্য করে।

  • একটি বিমূর্ত সদস্য পুরোপুরি ভার্চুয়াল is বিমূর্তটিকে কিছু ভাষায় খাঁটি ভার্চুয়াল বলা যেতে পারে।

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

2

আমি কিছু জায়গায় দেখেছি বিমূর্ত পদ্ধতিটি নীচে হিসাবে সংজ্ঞায়িত করা হয়েছে। **

"একটি বিমূর্ত পদ্ধতি অবশ্যই শিশু শ্রেণিতে প্রয়োগ করতে হবে"

** আমি অনুভব করেছি এটি এমনই।

কোনও শিশু শ্রেণিতে একটি বিমূর্ত পদ্ধতি প্রয়োগ করা প্রয়োজন হয় না, যদি শিশু শ্রেণিটিও বিমূর্ত হয় ..

1) একটি বিমূর্ত পদ্ধতি নাকিসুরে কথা একটি বেসরকারি পদ্ধতি। 2) একটি বিমূর্ত পদ্ধতি ক্যান্ট একই বিমূর্ত ক্লাসে বাস্তবায়িত হবে।

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

ভার্চুয়াল পদ্ধতিটি উত্তরাধিকার সূত্রে প্রাপ্ত শ্রেণিতে প্রয়োগ করা প্রয়োজন হয় না।

                                 ----------CODE--------------

public abstract class BaseClass
{
    public int MyProperty { get; set; }
    protected abstract void MyAbstractMethod();

    public virtual void MyVirtualMethod()
    {
        var x = 3 + 4;
    }

}
public abstract class myClassA : BaseClass
{
    public int MyProperty { get; set; }
    //not necessary to implement an abstract method if the child class is also abstract.

    protected override void MyAbstractMethod()
    {
        throw new NotImplementedException();
    }
}
public class myClassB : BaseClass
{
    public int MyProperty { get; set; }
    //You must have to implement the abstract method since this class is not an abstract class.

    protected override void MyAbstractMethod()
    {
        throw new NotImplementedException();
    }
}

2

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

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

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

জর্জ ডাব্লু বুশ ভাবুন। তিনি তার সৈন্যদের বলেছেন: "ইরাকে যুদ্ধ করুন"। এবং এটাই. তিনি যা নির্দিষ্ট করেছেন তা হ'ল লড়াই অবশ্যই করতে হবে। কীভাবে সে নির্দিষ্ট করে দেয় না ঘটবে । তবে আমি বলতে চাইছি আপনি কেবল "লড়াই" করতে পারবেন না: এর অর্থ কী? আমি কি বি -52 বা আমার ড্রেইঞ্জারের সাথে লড়াই করব? এই নির্দিষ্ট বিবরণ অন্য কারও কাছে রেখে দেওয়া হয়েছে। এটি একটি বিমূর্ত পদ্ধতি।

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

ডেভিড পেট্রিয়াস সেনাবাহিনীতে উঁচুতে আছেন। তিনি লড়াইয়ের অর্থ কী তা নির্ধারণ করেছেন:

  1. শত্রু সন্ধান করুন
  2. তাকে নিরপেক্ষ করুন।
  3. তারপরে একটি বিয়ার রাখুন

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

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

  1. শত্রু সন্ধান করুন।
  2. তাকে মাথায় গুলি করুন।
  3. বাড়িতে যেতে
  4. বিয়ার আছে।

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

  1. শত্রু সন্ধান করুন।
  2. তাকে কিছু বিএস ট্রাম্প আপের অভিযোগে গ্রেপ্তার করুন।
  3. বাড়িতে যেতে
  4. বিয়ার আছে।

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

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

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

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

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


2

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

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

● এতে শরীর থাকে না।

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

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

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

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

Over এটিকে ওভাররাইড করা হবে কিনা তা উদ্ভূত শ্রেণীর উপর নির্ভর করে।


1

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


1

বিমূর্ত ফাংশন একটি শরীর থাকতে পারে না এবং শিশু শ্রেণীর দ্বারা ওভাররাইড করা আবশ্যক

ভার্চুয়াল ফাংশনটির একটি দেহ থাকবে এবং শিশু শ্রেণীর দ্বারা ওভাররাইড করা হতে পারে


1

সাধারণ অবজেক্ট ভিত্তিক দৃষ্টিভঙ্গি থেকে:

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

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

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


1

একটি বিমূর্ত ফাংশন বাস্তবায়ন ব্যতিরেকে একটি "স্বাক্ষর" একটি স্বাক্ষর। এটি একটি ইন্টারফেসে ক্লাসটি কীভাবে ব্যবহার করা যেতে পারে তা ঘোষণা করতে ব্যবহৃত হয়। এটি অবশ্যই উত্পন্ন ক্লাসের একটিতে প্রয়োগ করা উচিত।

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

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


0

সি # তে কল ভার্চুয়াল ক্লাস কিছুই নেই।

ফাংশন জন্য

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

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


0

অ্যাবস্ট্রাক্ট পদ্ধতির কোনও বাস্তবায়ন নেই t এটি পিতামাতার ক্লাসে ঘোষণা করা হয়। শিশু শ্রেণি সেই পদ্ধতিটি বাস্তবায়নের জন্য প্রশংসনীয়।

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


0

একটি সি ++ ব্যাকগ্রাউন্ড থেকে, সি # ভার্চুয়ালটি সি ++ ভার্চুয়ালের সাথে মিলে যায়, যখন সি # বিমূর্ত পদ্ধতি সি ++ খাঁটি ভার্চুয়াল ফাংশনের সাথে মিলে যায়


0

একটি বিমূর্ত ফাংশন বা পদ্ধতি কোনও শ্রেণীর দ্বারা প্রকাশিত একটি "প্রকাশিত অপারেশন নাম", এর লক্ষ্য, বিমূর্ত শ্রেণির পাশাপাশি মূলত কোনও অবজেক্টটি প্রয়োগ করতে হয় এমন কাঠামোর বিরুদ্ধে মূলত অবজেক্ট ডিজাইনে একধরণের বাধা প্রদান করে provide

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

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

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

তারা উভয় একটি ফর্ম প্রতিনিধিত্ব polymorpfhism বস্তুর স্থিতিবিন্যাস দৃষ্টান্ত হবে।

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

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


0

এখানে আমি কয়েকটি নমুনা কোড লিখছি এই আশায় যে এটি একটি খুব মৌলিক স্তরের ইন্টারফেস, বিমূর্ত শ্রেণি এবং সাধারণ শ্রেণীর আচরণগুলি দেখার জন্য বরং একটি বাস্তব উদাহরণ হতে পারে। আপনি যদি এই কোডটিকে একটি ডেমো হিসাবে ব্যবহার করতে চান তবে আপনি এই কোডটি গিথুবে একটি প্রকল্প হিসাবেও পেতে পারেন: https://github.com/usavas/JavaAbstractAndInterfaceDemo

public interface ExampleInterface {

//    public void MethodBodyInInterfaceNotPossible(){
//    }
    void MethodInInterface();

}

public abstract class AbstractClass {
    public abstract void AbstractMethod();

    //    public abstract void AbstractMethodWithBodyNotPossible(){
    //
    //    };

    //Standard Method CAN be declared in AbstractClass
    public void StandardMethod(){
        System.out.println("Standard Method in AbstractClass (super) runs");
    }
}

public class ConcreteClass
    extends AbstractClass
    implements ExampleInterface{

    //Abstract Method HAS TO be IMPLEMENTED in child class. Implemented by ConcreteClass
    @Override
    public void AbstractMethod() {
        System.out.println("AbstractMethod overridden runs");
    }

    //Standard Method CAN be OVERRIDDEN.
    @Override
    public void StandardMethod() {
        super.StandardMethod();
        System.out.println("StandardMethod overridden in ConcreteClass runs");
    }

    public void ConcreteMethod(){
        System.out.println("Concrete method runs");
    }

    //A method in interface HAS TO be IMPLEMENTED in implementer class.
    @Override
    public void MethodInInterface() {
        System.out.println("MethodInInterface Implemented by ConcreteClass runs");

    //    Cannot declare abstract method in a concrete class
    //    public abstract void AbstractMethodDeclarationInConcreteClassNotPossible(){
    //
    //    }
    }
}

0

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


-4

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

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

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

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

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

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