ট্র্যাক
/
C#
C#
/
সিলেবাস
/
অপারেটর ওভারলোডিং
অপ

অপারেটর ওভারলোডিং মধ্যে C#

2টি অনুশীলনী

অপারেটর ওভারলোডিং সম্পর্কে

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

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

বেশিরভাগ অপারেটরের রূপটি এমন:

static <return type> operaator <operator symbols>(<parameters>);

কাস্ট অপারেটরগুলোর রূপটি এমন:

static (explicit|implicit) operator <cast-to-type>(<cast-from-type> <parameter name>);

অপারেটরগুলো স্ট্যাটিক মেথডের মতোই আচরণ করে।

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

সিনট্যাক্সের উদাহরণ:

struct Point
{
    decimal x;
    decimal y;

    public static bool operator ==(Point pt, Point ptOther)
    {
        return pt.x == ptOther.x && pt.y == ptOther.y;
    }

    public static bool operator !=(Point pt, Point ptOther)
    {
        return !(pt == ptOther);
    }

    public static Point operator *(Point pt, decimal scale)
    {
        var ptNew = new Point();
        ptNew.x = pt.x * scale;
        ptNew.y = pt.y * scale;
        return ptNew;
    }

    public static implicit operator Point((decimal x, decimal y) xy)
    {
        var pt = new Point();
        pt.x = xy.x;
        pt.y = xy.y;
        return pt;
    }

    public static explicit operator (decimal x, decimal y)(Point pt)
    {
        return (pt.x, pt.y);
    }
}

প্রায়ই একটি Equals() মেথড ইমপ্লিমেন্ট করা এবং == অপারেটর থেকে সেটি কল করা ভালো ফল দেয়। একইভাবে, তুলনার জন্য আপনি IComparable ইন্টারফেসটি ইমপ্লিমেন্ট করতে পারেন। দুই ক্ষেত্রেই আপনি প্রায় এক ঢিলে দুই পাখি মারার সুযোগ পাবেন।

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

লক্ষ্য করুন, প্যারামিটারগুলোর টাইপ আলাদা হলে তাদের ক্রম গুরুত্বপূর্ণ। উপরের উদাহরণের কোডে pt * 10m একটি বৈধ এক্সপ্রেশন, কিন্তু 10m * pt কম্পাইল হবে না।

রেফারেন্স

অপারেটর ওভারলোডিংয়ের এই ডকুমেন্টেশনে সিনট্যাক্সের বিস্তারিত বিবরণ রয়েছে।

GitHub-এর মাধ্যমে সম্পাদনা করুন লিংকটি নতুন একটি উইন্ডো বা ট্যাবে খুলবে

অপারেটর ওভারলোডিং শিখুন

অনুশীলন লক করা আছে

অপারেটর ওভারলোডিং অনুশীলন করতে আরও ১টি অনুশীলনী আনলক করুন