আমরা যখন শিশু শ্রেণিতে প্রয়োগ করি তখন বিমূর্ত পদ্ধতিগুলির সামনে ওভাররাইড কীওয়ার্ড থাকা দরকার কেন?


9

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

public abstract class Person
{
    public Person()
    {

    }

    protected virtual void Greet()
    {
        // code
    }

    protected abstract void SayHello();
}

public class Employee : Person
{
    protected override void SayHello() // Why is override keyword necessary here?
    {
        throw new NotImplementedException();
    }

    protected override void Greet()
    {
        base.Greet();
    }
}

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


2
একটি বিমূর্ত পদ্ধতি
— স্পষ্টতই


"উত্তরাধিকার সূত্রে প্রাপ্ত উত্তরাধিকার পদ্ধতি, সম্পত্তি, সূচক বা ইভেন্টের বিমূর্ত বা ভার্চুয়াল প্রয়োগ বাড়াতে বা সংশোধন করার জন্য ওভাররাইড সংশোধক প্রয়োজন।" ডকস.মাইক্রোসফট.এইন
— ডটনেট /

2
কারণ আপনি যদি এটি সেখানে না রাখেন তবে আপনি পদ্ধতিটিকে ওভাররাইড করার পরিবর্তে "গোপন" করছেন। এই কারণেই আপনি এই সতর্কতাটি পেয়েছেন যে "যদি এটিই আপনার ইচ্ছা ছিল, newকীওয়ার্ডটি ব্যবহার করুন ... আপনি" কোনও বুনিয়াদি বেস শ্রেণীর পদ্ধতিতে ওভাররাইড করে না "ত্রুটিটিও পেয়ে যাবেন
— রন বায়ার

@ রনবায়ার একটি ভার্চুয়াল পদ্ধতিতে হ্যাঁ, তবে বিমূর্ততার সাহায্যে এটি সংকলন করতে পারে না।
— জননাথন বার্কলে

উত্তর:


14

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

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

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

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

এটিই মূল যুক্তি। আমরা এখন আরও কিছু উন্নত যুক্তিতে যেতে পারি।

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

যদিও এই বিন্দুটি যুক্তিসঙ্গত, তবে বেশ কয়েকটি প্রতিপক্ষ রয়েছে, যেমন:

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

আসুন তাহলে এই বিন্দুতে আরও উন্নত যুক্তি তৈরি করা যাক। বেস ক্লাস কী করে তা না জানার জন্য কোন পরিস্থিতিতে উদ্ভূত শ্রেণীর লেখককে ক্ষমা করা যেতে পারে? ভাল, এই পরিস্থিতিতে বিবেচনা করুন:

  • বেস শ্রেণীর লেখক একটি বিমূর্ত বেস ক্লাস বি করেন
  • উদ্ভূত শ্রেণীর লেখক, একটি ভিন্ন দলে, পদ্ধতি এম দিয়ে একটি উত্পন্ন ক্লাস ডি তৈরি করে
  • বেস ক্লাসের লেখক বুঝতে পেরেছেন যে টিমগুলি বেস ক্লাস বি প্রসারিত করে তাদের সর্বদা একটি পদ্ধতি এম সরবরাহ করা প্রয়োজন, সুতরাং বেস শ্রেণীর লেখক বিমূর্ত পদ্ধতি এম যোগ করে M.
  • ক্লাস ডি পুনরায় সংকলিত হয়, তখন কি ঘটে?

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

আপনার উদাহরণে, অনুমান করা overrideছিল ঐচ্ছিক উপর SayHelloকারণ এটি একটি বিমূর্ত পদ্ধতি অগ্রাহ্য করা হয়। দুটি সম্ভাবনা রয়েছে: (১) কোডটির লেখক একটি বিমূর্ত পদ্ধতি ওভাররাইড করতে চান, বা (২) ওভাররাইডিং পদ্ধতি দুর্ঘটনার দ্বারা ওভাররাইড হচ্ছে কারণ অন্য কেউ বেস ক্লাস পরিবর্তন করেছে, এবং কোডটি এখন কিছু সূক্ষ্মভাবে ভুল। Theseচ্ছিক হলে overrideআমরা এই সম্ভাবনাগুলি আলাদা করে বলতে পারি না ।

কিন্তু যদি overrideহয় প্রয়োজনীয় তারপর আমরা তিনটি বিশেষ পরিস্থিতিতে বলতে পারেন। যদি কোডে একটি সম্ভাব্য ভুল তারপর overrideহয় অনুপস্থিত । এটা ইচ্ছাকৃতভাবে অগ্রাহ্য করা থাকে তবে overrideহয় বর্তমান । আর এটা যদি ইচ্ছাকৃতভাবে করা হয় না অগ্রাহ্য তারপর newহয় বর্তমান । সি # এর ডিজাইন আমাদের এই সূক্ষ্ম পার্থক্য তৈরি করতে সক্ষম করে।

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

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


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

গভীরতার ব্যাখ্যার জন্য আপনাকে ধন্যবাদ! এটা সত্যিই কৃতজ্ঞ.
— PSj01

দুর্দান্ত পয়েন্ট! আপনি উল্লেখ করেছেন এমন কিছু অন্যান্য প্রশ্বাসের তালিকা তৈরি করতে পারেন?
— aksh1618

3

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

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


ভাষা নকশা দলের যুক্তি বোঝার জন্য এটি একটি ভাল শুরু; আমি একটি উত্তর যুক্ত করেছি যা দেখায় যে দলটি এখানে আপনি যে ধারণাটি দিয়েছিলেন তা দিয়ে কীভাবে শুরু হয় তবে এটি আরও একধাপ এগিয়ে নিয়ে যায়।
— এরিক লিপার্ট

1

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

এটিকে কিছুটা পুনঃব্যবহার করার জন্য - আপনি কিছু ধরণের দেরি বাঁধাই বাস্তবায়নের জন্য ভার্চুয়াল পদ্ধতি ব্যবহার করেন, তবে বিমূর্ত পদ্ধতিগুলি ধরণের সাবক্লাসগুলিকে এই পদ্ধতিটি স্পষ্টভাবে ওভাররাইড করতে বাধ্য করে। যে বিন্দু, যখন পদ্ধতি virtual, এটা করতে পারেন , উপেক্ষা করা হতে যখন এটি একটি এর abstract- এটি আবশ্যক ওভাররাইড করা যেতে


1
আমি মনে করি প্রশ্নটি এটি কী করে তা নিয়ে নয়, তবে কেন এটি সুস্পষ্ট হতে হবে।
— জোনাথন বার্কলে

0

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

public abstract class MyBase
{
    public virtual void MyVirtualMethod() { }

    public virtual void MyOtherVirtualMethod() { }

    public abstract void MyAbtractMethod();
}

public class MyDerived : MyBase
{
    // When overriding a virtual method in MyBase, we use the override keyword.
    public override void MyVirtualMethod() { }

    // If we want to hide the virtual method in MyBase, we use the new keyword.
    public new void MyOtherVirtualMethod() { }

    // Because MyAbtractMethod is abstract in MyBase, we have to override it: 
    // we can't hide it with new.
    // For consistency with overriding a virtual method, we also use the override keyword.
    public override void MyAbtractMethod() { }
}

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


পুনরায়: "ডিজাইনাররা সিদ্ধান্ত নিয়েছিলেন যে এটি বিভ্রান্তিকর হবে কারণ এটি ভার্চুয়াল পদ্ধতিতে ওভাররাইডের সাথে সামঞ্জস্যপূর্ণ নয়" - হ্যাঁ, তবে আরও বেশি। ধরুন আপনার একটি ভার্চুয়াল পদ্ধতি এম এবং একটি ওভাররাইড সহ একটি উত্পন্ন ক্লাস ডি সহ একটি বেস ক্লাস বি রয়েছে। এখন ধরুন বি এর লেখক এম বিমূর্ত করার সিদ্ধান্ত নিয়েছেন। এটি একটি ব্রেকিং পরিবর্তন, তবে সম্ভবত তারা তা করে। প্রশ্ন: ডি লেখকের অপসারণ করা দরকার override? আমি মনে করি বেশিরভাগ লোক সম্মত হবে যে ডি এর লেখককে একটি অপ্রয়োজনীয় কোড পরিবর্তন করতে বাধ্য করা অযৌক্তিক; তাদের ক্লাস ঠিক আছে!
— এরিক লিপার্ট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.