ট্র্যাক
/
C#
C#
/
অনুশীলনী
/
উইজার্ড ও যোদ্ধা
উইজার্ড ও যোদ্ধা

উইজার্ড ও যোদ্ধা

লার্নিং অনুশীলনী

ভূমিকা

ইনহেরিটেন্স

C#-এ ইনহেরিটেন্স ব্যবহার করে একটি ক্লাস-হায়ারার্কি ডিফাইন করা যায়, যা একটি ডেরাইভড ক্লাসকে (Car) তার প্যারেন্ট ক্লাসের (Vehicle) আচরণ ও ডেটা ইনহেরিট করার সুযোগ দেয়। কোনো প্যারেন্ট নির্দিষ্ট না থাকলে ক্লাসটি object ক্লাস থেকে ইনহেরিট করে।

প্যারেন্ট ক্লাস তিনভাবে ডেরাইভড ক্লাসকে ফাংশনালিটি দিতে পারে:

  • একটি সাধারণ মেথড ডিফাইন করা।
  • একটি virtual মেথড ডিফাইন করা, যা সাধারণ মেথডের মতোই, তবে ডেরাইভড ক্লাস এটিকে বদলাতে পারে।
  • একটি abstract মেথড ডিফাইন করা, যা ইমপ্লিমেন্টেশন ছাড়া একটি মেথড এবং ডেরাইভড ক্লাসকে এটি অবশ্যই ইমপ্লিমেন্ট করতে হবে। যে ক্লাসে abstract মেথড থাকে, সেই ক্লাসটিকেও abstract হিসেবে চিহ্নিত করতে হবে। অ্যাবস্ট্রাক্ট ক্লাস ইনস্ট্যান্টিয়েট করা যায় না।

protected অ্যাক্সেস মডিফায়ার একটি প্যারেন্ট ক্লাসের সদস্যকে ডেরাইভড ক্লাসে অ্যাক্সেস করার সুযোগ দেয়, কিন্তু অন্য ক্লাস থেকে অ্যাক্সেস আটকে দেয়।

ডেরাইভড ক্লাস base কিওয়ার্ডের মাধ্যমে প্যারেন্ট ক্লাসের সদস্যগুলো অ্যাক্সেস করতে পারে।

// Inherits from the 'object' class
abstract class Vehicle
{
    // Can be overridden
    public virtual void Drive()
    {
    }

    // Must be overridden
    protected abstract int Speed();
}

class Car : Vehicle
{
    public override void Drive()
    {
        // Override virtual method

        // Call parent implementation
        base.Drive();
    }

    protected override int Speed()
    {
        // Implement abstract method
    }
}

ডেরাইভড ক্লাসের কনস্ট্রাক্টর নিজের কনস্ট্রাক্টরের লজিক চালানোর আগে স্বয়ংক্রিয়ভাবে তার প্যারেন্টের কনস্ট্রাক্টর কল করবে। base কিওয়ার্ড ব্যবহার করে প্যারেন্ট ক্লাসের কনস্ট্রাক্টরে আর্গুমেন্ট পাঠানো যায়:

abstract class Vehicle
{
    protected Vehicle(int wheels)
    {
        Console.WriteLine("Called first");
    }
}

class Car : Vehicle
{
    public Car() : base(4)
    {
        Console.WriteLine("Called second");
    }
}

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

abstract class Vehicle
{
   public abstract string GetDescription();
}

class Car : Vehicle
{
   public Car()
   {
   }

   public override string GetDescription()
   {
      return "Runabout";
   }
}

class Rig : Vehicle
{
   public Rig()
   {
   }

   public override string GetDescription()
   {
      return "Big Rig";
   }
}

Vehicle v1 = new Car();
Vehicle v2 = new Rig();

v1.GetDescription();
// => Runabout
v2.GetDescription();
// => Big Rig

নির্দেশনা

এই অনুশীলনীতে আপনি "উইজার্ড অ্যান্ড ওয়ারিয়রস" নামের একটি রোল-প্লেয়িং গেম খেলছেন, যেখানে আপনি Wizard অথবা Warrior হিসেবে খেলতে পারেন।

Warrior এবং Wizard-দের জন্য আলাদা আলাদা নিয়ম আছে, যা নির্ধারণ করে তারা কত ড্যামেজ পয়েন্ট দেয়।

Warrior-এর ক্ষেত্রে নিয়মগুলো হলো:

  • যে ক্যারেক্টারের ওপর আক্রমণ করা হচ্ছে সে ভালনারেবল না হলে ৬ পয়েন্ট ড্যামেজ দেয়
  • যে ক্যারেক্টারের ওপর আক্রমণ করা হচ্ছে সে ভালনারেবল হলে ১০ পয়েন্ট ড্যামেজ দেয়

Wizard-এর ক্ষেত্রে নিয়মগুলো হলো:

  • Wizard আগে থেকে স্পেল প্রস্তুত করে রাখলে ১২ পয়েন্ট ড্যামেজ দেয়
  • Wizard আগে থেকে স্পেল প্রস্তুত না করলে ৩ পয়েন্ট ড্যামেজ দেয়

সাধারণভাবে ক্যারেক্টাররা কখনোই ভালনারেবল হয় না। তবে Wizard-রা স্পেল প্রস্তুত না থাকলে ভালনারেবল হয়।

ছয়টি কাজে আপনাকে Warrior এবং Wizard ক্যারেক্টার নিয়ে কাজ করতে হবে।

1. একটি ক্যারেক্টার বর্ণনা করুন

Character ক্লাসের ToString() মেথড ওভাররাইড করুন, যাতে এটি ক্যারেক্টারের একটি বর্ণনা রিটার্ন করে, যার ফরম্যাট হবে "Character is a <CHARACTER_TYPE>"।

var warrior = new Warrior();
warrior.ToString();
// => "Character is a Warrior"

2. ক্যারেক্টাররা যেন ডিফল্টভাবে ভালনারেবল না হয় তা নিশ্চিত করুন

নিশ্চিত করুন যে Character.Vulnerable() মেথড সবসময় false রিটার্ন করে।

var warrior = new Warrior();
warrior.Vulnerable();
// => false

3. Wizard-দের স্পেল প্রস্তুত করতে দিন

Wizard.PrepareSpell() মেথড ইমপ্লিমেন্ট করুন, যাতে একজন Wizard আগে থেকে একটি স্পেল প্রস্তুত করতে পারে।

var wizard = new Wizard();
wizard.PrepareSpell();

4. স্পেল প্রস্তুত না থাকলে Wizard-দের ভালনারেবল করে তুলুন

নিশ্চিত করুন যে Wizard স্পেল প্রস্তুত না করলে Vulnerable() মেথড true রিটার্ন করে; অন্যথায় false রিটার্ন করে।

var wizard = new Wizard();
wizard.Vulnerable();
// => true

5. একজন Wizard-এর ড্যামেজ পয়েন্ট হিসাব করুন

Wizard.DamagePoints() মেথড ইমপ্লিমেন্ট করুন, যাতে প্রদত্ত ড্যামেজ পয়েন্ট রিটার্ন হয়: স্পেল প্রস্তুত থাকলে ১২ ড্যামেজ পয়েন্ট, না থাকলে ৩ ড্যামেজ পয়েন্ট।

var wizard = new Wizard();
var warrior = new Warrior();

wizard.PrepareSpell();
wizard.DamagePoints(warrior);
// => 12

6. একজন Warrior-এর ড্যামেজ পয়েন্ট হিসাব করুন

Warrior.DamagePoints() মেথড ইমপ্লিমেন্ট করুন, যাতে প্রদত্ত ড্যামেজ পয়েন্ট রিটার্ন হয়: টার্গেট ভালনারেবল হলে ১০ ড্যামেজ পয়েন্ট, না হলে ৬ ড্যামেজ পয়েন্ট।

var warrior = new Warrior();
var wizard = new Wizard();

warrior.DamagePoints(wizard);
// => 10
GitHub-এর মাধ্যমে সম্পাদনা করুন লিংকটি একটি নতুন উইন্ডো বা ট্যাবে খোলে
C# Exercism

উইজার্ড ও যোদ্ধা শুরু করতে প্রস্তুত?

Exercism-এ সাইন আপ করুন, C# ট্র্যাকের 62টি কনসেপ্ট178টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।