না, আপনি একটি অ-ভার্চুয়াল পদ্ধতি ওভাররাইড করতে পারবেন না। আপনি যে নিকটতম জিনিসটি করতে পারেন তা হ'ল new
একই নামের সাথে একটি পদ্ধতি তৈরি করে পদ্ধতিটি আড়াল করা তবে এটি ভাল ডিজাইনের নীতিগুলি ভঙ্গ করে বলে এটি উপযুক্ত নয়।
এমনকি কোনও পদ্ধতি লুকিয়ে রাখার পরেও আপনাকে সত্যিকারের ভার্চুয়াল পদ্ধতিতে কল করার মতো পদ্ধতি কলগুলি বহন করার সময় দেয় না pol এই উদাহরণ বিবেচনা করুন:
using System;
class Example
{
static void Main()
{
Foo f = new Foo();
f.M();
Foo b = new Bar();
b.M();
}
}
class Foo
{
public void M()
{
Console.WriteLine("Foo.M");
}
}
class Bar : Foo
{
public new void M()
{
Console.WriteLine("Bar.M");
}
}
এই উদাহরণে উভয় M
পদ্ধতি মুদ্রণ কল Foo.M
। যেমন যে বস্তুর রেফারেন্স সঠিক উদ্ভূত ধরনের কিন্তু একটি বেস পদ্ধতি গোপন আপনি যতদিন একটি পদ্ধতি জন্য একটি নতুন বাস্তবায়ন বিস্তার করার অনুমতি দিয়েছেন আপনি এই পদ্ধতির দেখতে পারেন না বিরতি পলিমরফিজম।
আমি আপনাকে সুপারিশ করব যে আপনি এই পদ্ধতিতে বেস পদ্ধতিগুলি গোপন করবেন না।
আমি সি # র ডিফল্ট আচরণের পক্ষে যারা তাদের পক্ষে রয়েছি যে পদ্ধতিগুলি ডিফল্টরূপে অ-ভার্চুয়াল (জাভার বিপরীতে)। আমি আরও এগিয়ে গিয়ে বলব যে ক্লাসগুলিও ডিফল্টরূপে সিল করা উচিত। উত্তরাধিকার সঠিকভাবে জন্য নকশা করা কঠিন এবং একটি পদ্ধতি যে ভার্চুয়াল হিসাবে চিহ্নিত করা হয় না তা বোঝায় যে সেই পদ্ধতির লেখক কখনই এই পদ্ধতিটিকে ওভাররাইড করার জন্য চাননি।
সম্পাদনা করুন: "এক্সিকিউশন সময় পলিমারফিক প্রেরণ" :
আমি এর দ্বারা যা বোঝাচ্ছি তা হ'ল ডিফল্ট আচরণ যা আপনি ভার্চুয়াল পদ্ধতিতে কল করার সময় কার্যকর হয়। উদাহরণস্বরূপ বলা যাক যে আমার আগের কোড উদাহরণে, একটি ভার্চুয়াল-নন পদ্ধতিটি সংজ্ঞায়িত করার পরিবর্তে আমি একটি ভার্চুয়াল পদ্ধতি এবং একটি সত্য ওভাররাইড পদ্ধতিও সংজ্ঞায়িত করেছি।
যদি আমি b.Foo
সেই ক্ষেত্রে কল করতে পারি , তবে সিএলআর সঠিকভাবে b
রেফারেন্সটি নির্দেশ করে Bar
এবং যে কলটি M
যথাযথভাবে প্রেরণ করবে তা সঠিকভাবে নির্ধারণ করবে ।