newএবং virtual/ এর মধ্যে পার্থক্য রয়েছে override।
আপনি কল্পনা করতে পারেন, একটি শ্রেণি, তাত্ক্ষণিকভাবে, এর পদ্ধতির প্রকৃত বাস্তবায়নের দিকে ইঙ্গিত করে পয়েন্টারগুলির একটি সারণী ছাড়া আর কিছুই নয়। নিম্নলিখিত চিত্রটি এটি সুন্দরভাবে কল্পনা করা উচিত:

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

যদি আপনার শ্রেণিতে বিমূর্ত সদস্য থাকে, তবে এটি হিসাবে চিহ্নিত করা দরকার abstract, অন্যথায় সংকলকটি আপনার অ্যাপ্লিকেশনটি সংকলন করবে না। আপনি abstractক্লাসের উদাহরণ তৈরি করতে পারবেন না , তবে আপনি তাদের কাছ থেকে উত্তরাধিকারী হয়ে উঠতে পারেন এবং উত্তরাধিকার সূত্রে প্রাপ্ত শ্রেণীর উদাহরণ তৈরি করতে পারেন এবং বেস শ্রেণীর সংজ্ঞা ব্যবহার করে এগুলি অ্যাক্সেস করতে পারেন। আপনার উদাহরণে এটি দেখতে চাই:
public abstract class Person
{
public abstract void ShowInfo();
}
public class Teacher : Person
{
public override void ShowInfo()
{
Console.WriteLine("I am a teacher!");
}
}
public class Student : Person
{
public override void ShowInfo()
{
Console.WriteLine("I am a student!");
}
}
যদি ডাকা ShowInfoহয়, বাস্তবায়নের উপর ভিত্তি করে আচরণের পরিবর্তিত হয়:
Person person = new Teacher();
person.ShowInfo(); // Shows 'I am a teacher!'
person = new Student();
person.ShowInfo(); // Shows 'I am a student!'
উভয়, Students এবং Teacherগুলি হয় Personগুলি, কিন্তু তারা বিভিন্ন আচরণ যখন তারা নিজেদের সম্পর্কে প্রম্পট তথ্যে বলা হবে। তবে, তাদের তথ্য প্রম্পট করতে বলার উপায়টি হ'ল: Personশ্রেণি ইন্টারফেস ব্যবহার করে ।
সুতরাং পর্দার পিছনে কি ঘটবে, যখন আপনি উত্তরাধিকারী হবেন Person? বাস্তবায়ন করার সময় ShowInfo, পয়েন্টারটি আর কোথাও নির্দেশ করে না , এটি এখন প্রকৃত বাস্তবায়নের দিকে নির্দেশ করে ! একটি Studentউদাহরণ তৈরি করার সময় , এটি Studentএস ShowInfo:

ভার্চুয়াল পদ্ধতি
দ্বিতীয় উপায়টি হল virtualপদ্ধতিগুলি ব্যবহার করা । আচরণটি একই রকম, আপনি নিজের বেস শ্রেণিতে একটি implementation চ্ছিক ডিফল্ট বাস্তবায়ন সরবরাহ না করে। virtualসদস্যদের সাথে শ্রেণিগুলি তাত্ক্ষণিকভাবে চালু করা যায় তবে উত্তরাধিকারসূত্রে প্রাপ্ত শ্রেণিগুলি বিভিন্ন বাস্তবায়ন সরবরাহ করতে পারে। আপনার কোডটি আসলে কাজের মতো দেখতে হবে তা এখানে:
public class Person
{
public virtual void ShowInfo()
{
Console.WriteLine("I am a person!");
}
}
public class Teacher : Person
{
public override void ShowInfo()
{
Console.WriteLine("I am a teacher!");
}
}
কী পার্থক্য হচ্ছে বেস সদস্য হয় Person.ShowInfoনির্দেশিত নয় কোথাও আর। এটিও কারণ, আপনি কেন উদাহরণ তৈরি করতে পারেন Person(এবং এর ফলে এটি abstractআর চিহ্নিত করার দরকার নেই):

আপনার লক্ষ্য করা উচিত, এটি এখনকার প্রথম চিত্রের চেয়ে আলাদা দেখাচ্ছে না। এর কারণ হল virtualপদ্ধতিটি একটি বাস্তবায়নের দিকে নির্দেশ করছে " মানক উপায় "। ব্যবহার virtual, আপনি বলতে পারেন Persons, যে তারা করতে পারেন (না উচিত নয় ) জন্য একটি ভিন্ন বাস্তবায়ন প্রদান ShowInfo। যদি আপনি উপরেরটির overrideমতো করে আলাদা আলাদা প্রয়োগকরণ (ব্যবহার করে ) সরবরাহ করেন Teacherতবে চিত্রটি যেমনটি দেখায় তেমনটি হবে abstract। কল্পনা করুন, আমরা Studentএর জন্য কাস্টম বাস্তবায়ন সরবরাহ করি নি :
public class Student : Person
{
}
কোডটি এভাবে কল করা হবে:
Person person = new Teacher();
person.ShowInfo(); // Shows 'I am a teacher!'
person = new Student();
person.ShowInfo(); // Shows 'I am a person!'
এবং চিত্রটি এর Studentমতো দেখায়:

৩. যাদু `নতুন` কীওয়ার্ড ওরফে" ছায়া "
newএই কাছাকাছি আরও একটি হ্যাক হয়। আপনি সাধারণীকৃত ক্লাসগুলিতে পদ্ধতি সরবরাহ করতে পারেন, যেগুলি বেস বর্গ / ইন্টারফেসের পদ্ধতির মতো একই নাম রয়েছে। উভয়ই নিজস্ব, কাস্টম প্রয়োগের দিকে নির্দেশ করে:

আপনি যে সরবরাহ করেছেন সেটি বাস্তবায়নের মতো দেখাচ্ছে। আপনি পদ্ধতিটিতে অ্যাক্সেস করার পদ্ধতির উপর ভিত্তি করে আচরণটি আলাদা হয়:
Teacher teacher = new Teacher();
Person person = (Person)teacher;
teacher.ShowInfo(); // Prints 'I am a teacher!'
person.ShowInfo(); // Prints 'I am a person!'
এই আচরণটি চাওয়া যেতে পারে তবে আপনার ক্ষেত্রে এটি বিভ্রান্তিকর।
আমি আশা করি এটি আপনার জন্য বিষয়গুলি আরও স্পষ্ট করে তুলবে!