পলিমারফিজম বনাম ওভাররাইডিং বনাম ওভারলোডিং


347

জাভা হিসাবে, যখন কেউ জিজ্ঞাসা:

পলিমারফিজম কী?

চান ওভারলোডিং বা অগ্রাহ্য একটি গ্রহণযোগ্য উত্তর হতে পারে?

আমি মনে করি এর চেয়ে আরও কিছু আছে।

যদি আপনার কোনও অ্যাবস্ট্রাক্ট বেস ক্লাস থাকে যা কোনও প্রয়োগ ছাড়াই একটি পদ্ধতির সংজ্ঞা দেয় এবং আপনি সেই উপ-শ্রেণিতে সেই পদ্ধতিটি সংজ্ঞায়িত করেছেন, তা কি এখনও ওভাররাইডিং হয়?

আমি মনে করি ওভারলোডিং নিশ্চিতভাবে সঠিক উত্তর নয়।


নীচে উত্তরগুলি পলিমারফিজম সম্পর্কে খুব ভালভাবে ব্যাখ্যা করে। তবে আমার ওভারলোডিং এক প্রকার পলিমারফিজম বলতে কড়া আপত্তি আছে, যা আমি আমার প্রশ্ন ও উত্তরকে যথাযথভাবে প্রমাণ করার চেষ্টা করেছি যা আসলে ওভারলোডিংয়ে মনোনিবেশ করে তা হল বহুবর্ষ বা না। আমি এই থ্রেডটিতে উপস্থিত @ ডিজিটাল গাবেগের উত্তরকে ন্যায়সঙ্গত করার চেষ্টা করেছি। পড়ুন বিবরণাদি: মেথড ওভারলোডিং একটি স্ট্যাটিক / কম্পাইল-টাইম বাঁধাই কিন্তু পলিমরফিজম হয়। পলিমারফিজমের সাথে স্থির বন্ধনের সাথে সম্পর্ক স্থাপন কি সঠিক?
প্রবীণকুমার লালাসঙ্গি

উত্তর:


894

পলিমারফিজম প্রকাশের সবচেয়ে সুস্পষ্ট উপায় হ'ল একটি বিমূর্ত বেস শ্রেণীর (বা ইন্টারফেস) মাধ্যমে

public abstract class Human{
   ...
   public abstract void goPee();
}

এই শ্রেণিটি বিমূর্ত কারণ goPee()পদ্ধতিটি মানুষের পক্ষে নির্ধারিত নয়। এটি কেবলমাত্র পুরুষ এবং মহিলা সাবক্লাসের জন্যই সুনির্দিষ্ট। এছাড়াও, মানব একটি বিমূর্ত ধারণা - আপনি এমন কোনও পুরুষ তৈরি করতে পারবেন না যা পুরুষ বা মহিলা নয়। এটি এক বা অন্য হতে হবে।

সুতরাং আমরা বিমূর্ত শ্রেণি ব্যবহার করে বাস্তবায়ন স্থগিত করি।

public class Male extends Human{
...
    @Override
    public void goPee(){
        System.out.println("Stand Up");
    }
}

এবং

public class Female extends Human{
...
    @Override
    public void goPee(){
        System.out.println("Sit Down");
    }
}

এখন আমরা মনুষ্য পূর্ণ একটি সম্পূর্ণ ঘর প্রস্রাব করতে বলতে পারি।

public static void main(String[] args){
    ArrayList<Human> group = new ArrayList<Human>();
    group.add(new Male());
    group.add(new Female());
    // ... add more...

    // tell the class to take a pee break
    for (Human person : group) person.goPee();
}

এটি চালালে ফল পাবেন:

Stand Up
Sit Down
...

37
@yuudachi। ক্লাস পড়ানোর সময় আমি এই উদাহরণটি নিয়ে এসেছি। ক্যানোনিকাল "ব্যাংক অ্যাকাউন্ট" শ্রেণিটি সত্যই বেস ক্লাসের "বিমূর্ততা" প্রকাশ করেনি। অন্যান্য ক্যানোনিকাল উদাহরণ (প্রাণী, শব্দ করুন) বোঝার জন্য খুব বিমূর্ত ছিল। আমি খুব সুস্পষ্ট সাবক্লাস সহ একটি একক বেস খুঁজছিলাম। আসলে, GoPee () কেবলমাত্র আমিই যে উদাহরণটি নিয়ে এসেছি তা যৌনতাবাদী বা গোঁড়ামি নয়। (যদিও ক্লাসে, আমি উঠে দাঁড়িয়ে বা বসার পরিবর্তে "বামদিকে হলটি মুদ্রণ করেছি")
ক্রিস চডমোর

100
এই উদাহরণটি জৈবিক সিস্টেমগুলি বর্ণনা করার জন্য একটি শ্রেণিবিন্যাসিক সিস্টেম ব্যবহার করার অসুবিধাটিও সুন্দরভাবে তুলে ধরে। কিছু মানুষ, যেমন খুব অল্প বয়সী, প্রায় কোনও অবস্থাতেই প্রস্রাব করে - এবং শিশুদের সহজেই GoPee () এ বলা যায় না। কিছু মানুষ আন্তঃআরক্ষক, যেখানে "পুরুষ" বা "মহিলা" এর জৈবিক লেবেলগুলি বরং বদ-সংজ্ঞায়িত হয়ে পড়ে; সামাজিক অর্থগুলি আরও জটিল। শিক্ষণ উদাহরণ হিসাবে, এটি দেখায় যে মডেলিং অনুমানগুলির নেতিবাচক ফলাফলগুলি কীভাবে হতে পারে, যেমন জড়িত যে কোনও ব্যক্তি (যেমন, ওও প্রোগ্রামিংয়ের একজন ছাত্র) যিনি অন্তর্নিহিত বা ইন্টারসেক্সটি প্রকৃতপক্ষে মানুষ নন।
অ্যান্ড্রু ডাল্ক

7
আমি কমপক্ষে কয়েক মুষ্টিমেয় মানুষের কথা চিন্তা করতে পারি যারা আপনার "আপনি এমন কোনও মানুষ তৈরি করতে পারবেন না যা পুরুষ বা মহিলা নয়" থিসিসটি অস্বীকার করবেন, যদিও এটি এখনও আপনার কোডের ক্ষেত্রে সত্য হতে পারে ... আমি মনে করি খারাপ বিমূর্ততা আমি বলছি ? ;)
ফ্রাঙ্ক ডব্লিউ। জম্মেটি

2
আমি মনে করি এটি উল্লেখ করা গুরুত্বপূর্ণ যে এটি কেবল বহুকর্মবাদ কারণ কারণ GoPee () এর কোন সংস্করণটি কল করা কেবল রানটাইমে নির্ধারণ করা যেতে পারে। যদিও এই উদাহরণটি বোঝায় যে, কেন এটি সঠিকভাবে বহুবাদী তা উল্লেখ করা ভাল is এছাড়াও, এটি সহোদর শ্রেণীর প্রয়োজন হয় না। এটি পিতামাতার সন্তানের সম্পর্কও হতে পারে। বা এমনকি পুরোপুরি সম্পর্কিত নয় এমন ক্লাসগুলির মধ্যে যা কাকতালীয়ভাবে একই ফাংশন রয়েছে। এর একটি উদাহরণ .toString () ফাংশন হতে পারে। যাকে যেকোন বস্তুর এলোমেলোভাবে বলা যেতে পারে তবে সংকলক কখনই বুঝতে পারে না কোন ধরণের অবজেক্টটি।
টোর ভ্যালামো

20
জৈবিক জটিলতায় নোটের জন্য অ্যান্ড্রুডালকে +1 করুন। এছাড়াও, goPeeএকটি ইনপুট হিসাবে মাধ্যাকর্ষণ ক্ষেত্র নেয় না। গ্লোবাল স্টেটের এই নির্ভরতা ইউনিট-টেস্টিংকে CatheterizedIntersexAstronautকঠিন করে তোলে এবং দেখায় যে সাবক্লাসিং বৈশিষ্ট্যগুলি রচনার জন্য সর্বদা সেরা পদ্ধতি নাও হতে পারে।
মাইক স্যামুয়েল 1

99

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

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

ওভারলোডিং হ'ল একই নামের সাথে বিভিন্ন পরামিতিগুলির সাথে একাধিক পদ্ধতি সংজ্ঞায়িত করার ক্রিয়া। এটি ওভাররাইডিং বা পলিমারফিজমের সাথে সম্পর্কিত নয়।


8
এটি পুরানো তবে পলিমারফিজম বলতে বোঝায় না যে অন্যান্য শ্রেণি অবশ্যই উত্তরাধিকার গাছের মধ্যে থাকতে হবে। এটি জাভাতে ঘটে যদি আপনি ইন্টারফেসগুলি উত্তরাধিকার গাছের অংশ হিসাবে বিবেচনা করেন তবে গো তে নয়, যেখানে ইন্টারফেসগুলি নিখুঁতভাবে প্রয়োগ করা হয়।
জেএন

5
প্রকৃতপক্ষে, পলিমারফিজমের জন্য আপনার কোনও ক্লাসের দরকার নেই।
StCredZero

3
আমি একজন নবাগত, এবং আমি ভুল হলে আমাকে সংশোধন করি, তবে আমি এটি বলব না যে অতিরিক্ত লোডিং বহুবিজ্ঞানের সাথে সম্পর্কিত নয়। কমপক্ষে জাভাতে, কলিমের ধরণের উপর ভিত্তি করে প্রয়োগটি যখন নির্বাচিত হয় তখন পলিমারফিজম হয়, এবং পরামিতিগুলির ধরণের ভিত্তিতে প্রয়োগটি যখন নির্বাচিত হয়, তাই না? দুজনের মধ্যে সাদৃশ্য দেখে তা বুঝতে আমার সহায়তা হয়।
csjacobs24

9
ত্রুটিপূর্ণ. Ad hoc polymorphismআপনি আপনার বর্ণনা করা হয় ওভারলোডিং বিভাগে এবং হয় পলিমরফিজম একটি কেস।
জেসি ক্যালডারন

1
"এটি ওভাররাইডিং বা বহুমুখীতার সাথে সম্পর্কিত নয়"। এই বক্তব্য ভুল।
শৈলেশ প্রতাপওয়ার

45

পলিমারফিজম মানে একাধিক ফর্ম, একই বস্তু প্রয়োজনীয়তা অনুযায়ী বিভিন্ন ক্রিয়াকলাপ সম্পাদন করে।

বহুবিজ্ঞান দুটি উপায় ব্যবহার করে অর্জন করা যেতে পারে, সেগুলি

  1. পদ্ধতি ওভাররাইডিং
  2. পদ্ধতি ওভারলোডিং

পদ্ধতি ওভারলোডিং মানে একই পদ্ধতির নাম ব্যবহার করে একই ক্লাসে দুটি বা ততোধিক পদ্ধতি লেখার কথা, তবে পাসিং প্যারামিটারগুলি আলাদা।

মেথড ওভাররাইডিং মানে আমরা বিভিন্ন ক্লাসে পদ্ধতির নামগুলি ব্যবহার করি, তার অর্থ শিশু শ্রেণিতে পিতামাতার ক্লাস পদ্ধতি ব্যবহৃত হয়।

জাভাতে পলিমারফিজম অর্জন করতে একটি সুপার ক্লাসের রেফারেন্স ভেরিয়েবল সাব-ক্লাস অবজেক্টকে ধরে রাখতে পারে।

বহুমুখীতা অর্জনের জন্য প্রতিটি বিকাশকারীকে অবশ্যই প্রকল্পের একই পদ্ধতির নামগুলি ব্যবহার করতে হবে।


4
সুন্দর উত্তরের জন্য +1। গৃহীত উত্তরটি কেবল এক ধরণের পলিমারফিজম ব্যাখ্যা করে। এই উত্তরটি সম্পূর্ণ।
আপাদানা

1
পলিমারফিজম একটি দৃষ্টান্ত (ওওপি), তবে ওভাররাইডিং এবং ওভারলোডিং ভাষা সুবিধা।
其 威

পলিমারফিজম জেনেরিক ধরণের মাধ্যমেও অর্জন করা যেতে পারে।
মিন্হ Nghĩa

43

সিউডো-সি # / জাভাতে পলিমারফিজমের উদাহরণ এখানে রয়েছে:

class Animal
{
    abstract string MakeNoise ();
}

class Cat : Animal {
    string MakeNoise () {
        return "Meow";
    }
}

class Dog : Animal {
    string MakeNoise () {
        return "Bark";
    }
}

Main () {
   Animal animal = Zoo.GetAnimal ();
   Console.WriteLine (animal.MakeNoise ());
}

প্রধান ফাংশনটি প্রাণীটির প্রকারটি জানে না এবং মেকনোয়েস () পদ্ধতির কোনও নির্দিষ্ট প্রয়োগের আচরণের উপর নির্ভর করে।

সম্পাদনা: দেখে মনে হচ্ছে ব্রায়ান আমাকে ঘুষি মারল। মজার বিষয় আমরা একই উদাহরণ ব্যবহার করেছি। তবে উপরের কোডটি ধারণাগুলি পরিষ্কার করতে সহায়তা করবে।


এটি রানটাইম পলিমারফিজমের উদাহরণ। পদ্ধতি ওভারলোডিং এবং জেনেরিক ধরণের মাধ্যমে কমপাইল টাইম পলিমারফিজমও সম্ভব।
পিট কির্খাম

আকৃতি -> সমান্তরাল -> আয়তক্ষেত্র -> স্কোয়ার
এমপেন

@ yankee2905 এই ক্ষেত্রে, আমি মনে করি আপনি ইন্টারফেস ব্যবহার করতে পারবেন, যেহেতু একটি শ্রেণি একাধিক ইন্টারফেস প্রয়োগ করতে পারে।
Sam003

1
@ জিশেং বা বিমূর্ত অভিভাবক শ্রেণিতে একটি প্রস্রাবের পদ্ধতি যুক্ত করছেন? আমি অন্য কিছু বাস্তবায়নের জন্য ইন্টারফেস ব্যবহার করব।
জোয় রোহান

42

পলিমারফিজম অর্জনের জন্য ওভাররাইডিং এবং ওভারলোডিং উভয়ই ব্যবহৃত হয়।

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

    abstract class Beverage {
       boolean isAcceptableTemperature();
    }

    class Coffee extends Beverage {
       boolean isAcceptableTemperature() { 
           return temperature > 70;
       }
    }

    class Wine extends Beverage {
       boolean isAcceptableTemperature() { 
           return temperature < 10;
       }
    }

আপনার কাছে এমন একটি পদ্ধতিও থাকতে পারে যা দুটি বা ততোধিক যুক্তি দিয়ে ওভারলোড হয়ে গেছে। পদ্ধতিটি আর্গুমেন্ট (গুলি) এর ধরণের (গুলি) এর উপর ভিত্তি করে বিভিন্ন জিনিস করে।

    class Server {
        public void pour (Coffee liquid) {
            new Cup().fillToTopWith(liquid);
        }

        public void pour (Wine liquid) {
            new WineGlass().fillHalfwayWith(liquid);
        }

        public void pour (Lemonade liquid, boolean ice) {
            Glass glass = new Glass();
            if (ice) {
                glass.fillToTopWith(new Ice());
            }
            glass.fillToTopWith(liquid);
        }
    }

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

7
আমি এখানে আমার উত্তরে যেমন বলেছি, আমি দ্বিমত পোষণ করছি - দুটি বৈশিষ্ট্য অরথগোনাল নয়, তবে ঘনিষ্ঠভাবে সম্পর্কিত। বহুবর্ষ! = উত্তরাধিকার আপনার আমার ভোট আছে।
পিটার মেয়ার 0

2
অন্য কথায়, পলিমারফিজম বনাম অ্যাড-হক পলিমॉर्फিজম টাইপ করুন। আমি এই উত্তরটিকে উজ্জীবিত করছি, যদিও এটি যতটা করা উচিত ঠিক ততটাই না, কারণ এটি সঠিকভাবে জানিয়েছে যে ওভারলোডিং এবং ওভাররাইড উভয়ই পলিমারফিজমের সাথে সম্পর্কিত। এই বলে যে ওওপি ভাষায় পলিমারফিজম কেবল শ্রেণীর উত্তরাধিকার দ্বারা অর্জন করা যায় তা কেবল ভুল - আমাদের মনে রাখা উচিত জাভা এবং সি ++ ছাড়াও আরও কিছু ওওপি ভাষা রয়েছে, যেখানে কেউ একাধিক প্রেরণ, অ্যাডহক পলিমারফিজম, প্যারামেট্রিক পলিমারফিজম ইত্যাদির মতো ধারণা ব্যবহার করতে পারে ।
rsenna

2
@rsenna এটি অসম্পূর্ণ হতে পারে তবে বাকী আইএমএইচওর তুলনায় এটি প্রশ্নের উত্তরের উত্তর দেয়। এছাড়াও, খুব সুন্দর যে আপনি অ্যাড-হক এবং প্যারামেট্রিক পলিমারফিজম উল্লেখ করেছেন।
ভ্যালেন্টিন রাদু

15

আপনি ঠিক বলেছেন যে ওভারলোডিং এর উত্তর নয়।

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


3
এটি পরিবর্তিত বস্তুর আচরণ হওয়া উচিত নয়, তবে তার বাস্তবায়ন। একই আচরণ, বিভিন্ন বাস্তবায়ন, এটি বহুবর্ষ।
কিউবিজিজেড

@ কিবিজিজেড আপনার আচরণের সংজ্ঞা দেওয়া দরকার , বিশেষত বিশেষণটি একইরূপে । আচরণ যদি একই হয় তবে তাদের বাস্তবায়ন কেন আলাদা হবে? এটি এমন নয় যে কেউ নির্দিষ্ট প্রয়োগের সাথে অসন্তুষ্ট হন, তাই এর জন্য আলাদা একটি প্রয়োজন।
Sнаđошƒаӽ

11

বিশেষত ওভারলোডিং বা ওভাররাইডিং সম্পূর্ণ চিত্র দেয় না বলে বলছে। পলিমারফিজম হ'ল কোনও সামগ্রীর ধরণের ভিত্তিতে তার আচরণ বিশেষায়িত করার ক্ষমতা।

আমি এখানে কিছু উত্তরগুলির সাথে একমত নই যে ওভারলোডিং হ'ল একধরণের পলিমারফিজম (প্যারামেট্রিক পলিমারফিজম) ক্ষেত্রে একই নামের একটি পদ্ধতি পৃথকভাবে বিভিন্ন প্যারামিটার ধরণের দিতে পারে give অপারেটর ওভারলোডিং এর একটি ভাল উদাহরণ। আপনি বিভিন্ন ধরণের পরামিতি গ্রহণ করতে "+" সংজ্ঞায়িত করতে পারেন - স্ট্রিং বা ইন্টের কথা বলুন - এবং এই ধরণের উপর ভিত্তি করে "+" আলাদাভাবে আচরণ করবে।

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


আপনি জড়িত শব্দের সাধারণভাবে যা বোঝায় সে অনুসারে আপনি সঠিক, তবে একটি প্রোগ্রামিং প্রসঙ্গে, যখন লোকেরা "পলিমারফিজম" বলেন তখন তাদের সর্বদা অর্থ "উত্তরাধিকার ভিত্তিক পলিমারফিজম" হয়। মজার বিষয়, তবে আমি মনে করি যে পলিমারফিজমকে এভাবে বর্ণনা করা মানুষকে বিভ্রান্ত করবে।
ডিজিটাল গাবেগ

উত্তরাধিকারের দিক দিয়ে পলিমারফিজমটি ব্যাখ্যা করা আরও সহজ হতে পারে, তবে এই বিশেষ প্রশ্নটি যেভাবে জিজ্ঞাসা করা হয়েছিল আমি মনে করি এটি প্যারামেট্রিক পলিমারফিজমও বর্ণনা করা বুদ্ধিমানের কাজ।
প্যাট্রিক ম্যাকএলহানি

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

2
আমি মনে করি ওভারলোডিং অ্যাড-হক_পলিমারফিজম হিসাবে আরও ভাল শ্রেণীবদ্ধ করা হয়েছে en.wikipedia.org/wiki/...
মনু

আমি নিম্নলিখিতটিতে 'দ্য ডিজিটাল গাবেগ' এর সাথে একমত হতে চাই। আপনি যদি ওওপি নিয়ে আলোচনা করে থাকেন তবে পলিমারফিজম বলতে সাধারণত টাইপ পলিমারফিজম বোঝায় এবং আপনি যদি টাইপ থিওরি নিয়ে আলোচনা করছেন তবে এর অর্থ কোনও প্রকার পলিমারফিজম।
মনু

7

পলিমারফিজমের সহজ অর্থ "বহু ফর্ম"।

এটি উত্তরাধিকার অর্জনের প্রয়োজন হয় না ... ইন্টারফেস বাস্তবায়ন হিসাবে, যা মোটেও উত্তরাধিকার নয়, বহুমুখী প্রয়োজনগুলি পরিবেশন করে। যুক্তিযুক্তভাবে, ইন্টারফেস বাস্তবায়ন উত্তরাধিকারের চেয়ে বহুগুণিত প্রয়োজন "আরও ভাল" পরিবেশন করে।

উদাহরণস্বরূপ, আপনি উড়তে পারে এমন সমস্ত কিছুর বর্ণনা দেওয়ার জন্য একটি সুপার-ক্লাস তৈরি করবেন? আমার উচিত হবে না। আপনাকে একটি ইন্টারফেস তৈরি করতে সেরা পরিবেশন করা হবে যা ফ্লাইটের বর্ণনা দেয় এবং এটিকে ছেড়ে দেয়।

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


2
অবশ্যই সেরা উত্তর। পলিমারফিজমটি সমস্ত ভাষার নির্মাণের ক্ষেত্রে প্রয়োগ করা যেতে পারে, এটি বিশেষ্য (শ্রেণি) বা ক্রিয়া (পদ্ধতি) হোক)
রাদু গ্যাসলার 26'12

6

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

কলিং কোডে তারা কোন নির্দিষ্ট প্রাণী তা জানতে হবে না।

আমি পলিমারফিজম হিসাবে যা মনে করি তা হ'ল।


4

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


4

আমরাও:

ওভারলোডিং হ'ল যখন আপনার একই ফাংশনের নাম থাকে যা বিভিন্ন পরামিতি নেয়।

ওভাররাইডিং তখন হয় যখন কোনও শিশু শ্রেণি পিতামাতার পদ্ধতির পরিবর্তিত হয় তার নিজের সাথে (এটি নিজেই বহুবর্ষবাদ গঠন করে না)।

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

জাভাতে আপনি সংগ্রহের লাইব্রেরির সাথে পলিমারফিজমটি দেখতে পান:

int countStuff(List stuff) {
  return stuff.size();
}

তালিকাটি বেস ক্লাস, আপনি যদি কোনও লিঙ্কযুক্ত তালিকা, ভেক্টর, অ্যারে বা একটি কাস্টম তালিকার বাস্তবায়ন গণনা করেন তবে কম্পাইলারের কোনও ক্লু নেই has যতক্ষণ না এটি তালিকার মতো কাজ করে:

List myStuff = new MyTotallyAwesomeList();
int result = countStuff(myStuff);

আপনি যদি ওভারলোডিং করে থাকতেন তবে:

int countStuff(LinkedList stuff) {...}
int countStuff(ArrayList stuff) {...}
int countStuff(MyTotallyAwesomeList stuff) {...}
etc...

এবং পরামিতিগুলির সাথে মেলে মিশ্রণের জন্য কাউন্টস্টফের সঠিক সংস্করণ () নেওয়া হবে।


4

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

যে কোনও ওওপি ভাষায় পলিমারফিজম কেন এত গুরুত্বপূর্ণ।

আসুন উত্তরাধিকার / পলিমॉर्फিজম এবং এর সাথে একটি টিভিতে একটি সাধারণ অ্যাপ্লিকেশন তৈরি করার চেষ্টা করি। অ্যাপ্লিকেশনটির প্রতিটি সংস্করণ পোস্ট করুন, আমরা একটি ছোট প্রাকট্রিসিপেক্টিভ করি।

ধরুন, আপনি একটি টিভি সংস্থার একটি সফটওয়্যার ইঞ্জিনিয়ার এবং আপনাকে ব্যবহারকারী কমান্ডের মান বাড়ানোর এবং হ্রাস করার জন্য আপনাকে ভলিউম, উজ্জ্বলতা এবং রঙ নিয়ন্ত্রকদের জন্য সফ্টওয়্যার লিখতে বলা হয়েছে।

আপনি এই বৈশিষ্ট্যগুলির প্রতিটিটির জন্য লেখার ক্লাস যুক্ত করে শুরু করুন

  1. সেট: - একটি নিয়ামকের মান নির্ধারণ করতে। (মনে করুন এটির নিয়ামকের নির্দিষ্ট কোড রয়েছে)
  2. পান: - একটি নিয়ামকের মান পেতে। (ধরুন এটিতে নিয়ামকের নির্দিষ্ট কোড রয়েছে)
  3. সামঞ্জস্য করুন: - ইনপুটটি বৈধকরণ এবং একটি নিয়ামক সেট করতে Gen (জেনেরিক বৈধতা .. নিয়ন্ত্রকদের থেকে পৃথক)
  4. নিয়ামকদের সাথে ব্যবহারকারী ইনপুট ম্যাপিং: - ব্যবহারকারী ইনপুট এবং তদনুসারে নিয়ন্ত্রকগুলিকে আহরণ করতে।

অ্যাপ্লিকেশন সংস্করণ 1

import java.util.Scanner;    
class VolumeControllerV1 {
    private int value;
    int get()    {
        return value;
    }
    void set(int value) {
        System.out.println("Old value of VolumeController \t"+this.value);
        this.value = value;
        System.out.println("New value of VolumeController \t"+this.value);
    }
    void adjust(int value)  {
        int temp = this.get();
        if(((value > 0) && (temp >= 100)) || ((value < 0) && (temp <= 0)))    {
            System.out.println("Can not adjust any further");
            return;
        }
        this.set(temp + value);
    }
}
class  BrightnessControllerV1 {
    private int value;
    int get()    {
        return value;
    }
    void set(int value) {
        System.out.println("Old value of BrightnessController \t"+this.value);
        this.value = value;
        System.out.println("New value of BrightnessController \t"+this.value);
    }
    void adjust(int value)  {
        int temp = this.get();
        if(((value > 0) && (temp >= 100)) || ((value < 0) && (temp <= 0)))    {
            System.out.println("Can not adjust any further");
            return;
        }
        this.set(temp + value);
    }
}
class ColourControllerV1    {
    private int value;
    int get()    {
        return value;
    }
    void set(int value) {
        System.out.println("Old value of ColourController \t"+this.value);
        this.value = value;
        System.out.println("New value of ColourController \t"+this.value);
    }
    void adjust(int value)  {
        int temp = this.get();
        if(((value > 0) && (temp >= 100)) || ((value < 0) && (temp <= 0)))    {
            System.out.println("Can not adjust any further");
            return;
        }
        this.set(temp + value);
    }
}

/*
 *       There can be n number of controllers
 * */
public class TvApplicationV1 {
    public static void main(String[] args)  {
        VolumeControllerV1 volumeControllerV1 = new VolumeControllerV1();
        BrightnessControllerV1 brightnessControllerV1 = new BrightnessControllerV1();
        ColourControllerV1 colourControllerV1 = new ColourControllerV1();


        OUTER: while(true) {
            Scanner sc=new Scanner(System.in);
            System.out.println(" Enter your option \n Press 1 to increase volume \n Press 2 to decrease volume");
            System.out.println(" Press 3 to increase brightness \n Press 4 to decrease brightness");
            System.out.println(" Press 5 to increase color \n Press 6 to decrease color");
            System.out.println("Press any other Button to shutdown");
            int button = sc.nextInt();
            switch (button) {
                case  1:    {
                    volumeControllerV1.adjust(5);
                    break;
                }
                case 2: {
                    volumeControllerV1.adjust(-5);
                    break;
                }
                case  3:    {
                    brightnessControllerV1.adjust(5);
                    break;
                }
                case 4: {
                    brightnessControllerV1.adjust(-5);
                    break;
                }
                case  5:    {
                    colourControllerV1.adjust(5);
                    break;
                }
                case 6: {
                colourControllerV1.adjust(-5);
                break;
            }
            default:
                System.out.println("Shutting down...........");
                break OUTER;
        }

    }
    }
}

এখন আপনার কাছে আমাদের প্রয়োগের প্রথম সংস্করণ স্থাপনের জন্য প্রস্তুত। এখন পর্যন্ত করা কাজ বিশ্লেষণ করার সময়।

টিভি অ্যাপ্লিকেশন সংস্করণে সমস্যাগুলি 1

  1. অ্যাডজাস্ট (ইনট মান) কোডটি তিনটি শ্রেণিতেই সদৃশ। আপনি কোড সদৃশটি ছোট করতে চান like (তবে আপনি ডুপ্লিকেট কোড এড়াতে সাধারণ কোড এবং এটিকে কিছু সুপার ক্লাসে নিয়ে যাওয়া ভাবেননি)

আপনার আবেদন যতক্ষণ প্রত্যাশা অনুযায়ী কাজ করবে আপনি ততক্ষণ তার সাথে বেঁচে থাকার সিদ্ধান্ত নিয়েছেন।

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

আপনি নতুন কার্যকারিতার জন্য একটি নতুন ক্লাস (রিসেটফিউশনভি 2) লেখা শুরু করেন এবং এই নতুন বৈশিষ্ট্যের জন্য ব্যবহারকারী ইনপুট ম্যাপিং কোডটি মানচিত্র করুন।

অ্যাপ্লিকেশন সংস্করণ 2

import java.util.Scanner;
class VolumeControllerV2    {

    private int defaultValue = 25;
    private int value;

    int getDefaultValue() {
        return defaultValue;
    }
    int get()    {
        return value;
    }
    void set(int value) {
        System.out.println("Old value of VolumeController \t"+this.value);
        this.value = value;
        System.out.println("New value of VolumeController \t"+this.value);
    }
    void adjust(int value)  {
        int temp = this.get();
        if(((value > 0) && (temp >= 100)) || ((value < 0) && (temp <= 0)))    {
            System.out.println("Can not adjust any further");
            return;
        }
        this.set(temp + value);
    }
}
class  BrightnessControllerV2   {

    private int defaultValue = 50;
    private int value;
    int get()    {
        return value;
    }
    int getDefaultValue() {
        return defaultValue;
    }
    void set(int value) {
        System.out.println("Old value of BrightnessController \t"+this.value);
        this.value = value;
        System.out.println("New value of BrightnessController \t"+this.value);
    }
    void adjust(int value)  {
        int temp = this.get();
        if(((value > 0) && (temp >= 100)) || ((value < 0) && (temp <= 0)))    {
            System.out.println("Can not adjust any further");
            return;
        }
        this.set(temp + value);
    }
}
class ColourControllerV2    {

    private int defaultValue = 40;
    private int value;
    int get()    {
        return value;
    }
    int getDefaultValue() {
        return defaultValue;
    }
    void set(int value) {
        System.out.println("Old value of ColourController \t"+this.value);
        this.value = value;
        System.out.println("New value of ColourController \t"+this.value);
    }
    void adjust(int value)  {
        int temp = this.get();
        if(((value > 0) && (temp >= 100)) || ((value < 0) && (temp <= 0)))    {
            System.out.println("Can not adjust any further");
            return;
        }
        this.set(temp + value);
    }
}

class ResetFunctionV2 {

    private VolumeControllerV2 volumeControllerV2 ;
    private BrightnessControllerV2 brightnessControllerV2;
    private ColourControllerV2 colourControllerV2;

    ResetFunctionV2(VolumeControllerV2 volumeControllerV2, BrightnessControllerV2 brightnessControllerV2, ColourControllerV2 colourControllerV2)  {
        this.volumeControllerV2 = volumeControllerV2;
        this.brightnessControllerV2 = brightnessControllerV2;
        this.colourControllerV2 = colourControllerV2;
    }
    void onReset()    {
        volumeControllerV2.set(volumeControllerV2.getDefaultValue());
        brightnessControllerV2.set(brightnessControllerV2.getDefaultValue());
        colourControllerV2.set(colourControllerV2.getDefaultValue());
    }
}
/*
 *       so on
 *       There can be n number of controllers
 *
 * */
public class TvApplicationV2 {
    public static void main(String[] args)  {
        VolumeControllerV2 volumeControllerV2 = new VolumeControllerV2();
        BrightnessControllerV2 brightnessControllerV2 = new BrightnessControllerV2();
        ColourControllerV2 colourControllerV2 = new ColourControllerV2();

        ResetFunctionV2 resetFunctionV2 = new ResetFunctionV2(volumeControllerV2, brightnessControllerV2, colourControllerV2);

        OUTER: while(true) {
            Scanner sc=new Scanner(System.in);
            System.out.println(" Enter your option \n Press 1 to increase volume \n Press 2 to decrease volume");
            System.out.println(" Press 3 to increase brightness \n Press 4 to decrease brightness");
            System.out.println(" Press 5 to increase color \n Press 6 to decrease color");
            System.out.println(" Press 7 to reset TV \n Press any other Button to shutdown");
            int button = sc.nextInt();
            switch (button) {
                case  1:    {
                    volumeControllerV2.adjust(5);
                    break;
                }
                case 2: {
                    volumeControllerV2.adjust(-5);
                    break;
                }
                case  3:    {
                    brightnessControllerV2.adjust(5);
                    break;
                }
                case 4: {
                    brightnessControllerV2.adjust(-5);
                    break;
                }
                case  5:    {
                    colourControllerV2.adjust(5);
                    break;
                }
                case 6: {
                    colourControllerV2.adjust(-5);
                    break;
                }
                case 7: {
                    resetFunctionV2.onReset();
                    break;
                }
                default:
                    System.out.println("Shutting down...........");
                    break OUTER;
            }

        }
    }
}

রিসেট বৈশিষ্ট্য সহ আপনার অ্যাপ্লিকেশন প্রস্তুত রয়েছে। তবে, এখন আপনি এটি বুঝতে শুরু করেন

টিভি অ্যাপ্লিকেশন সংস্করণ 2-এ ইস্যু

  1. যদি পণ্যটিতে একটি নতুন নিয়ন্ত্রক প্রবর্তিত হয়, আপনাকে রিসেট বৈশিষ্ট্য কোডটি পরিবর্তন করতে হবে।
  2. যদি কন্ট্রোলারের গণনা খুব বেশি বৃদ্ধি পায় তবে আপনার নিয়ন্ত্রণকারীদের রেফারেন্স ধরে রাখতে সমস্যা হবে।
  3. রিসেট বৈশিষ্ট্য কোডটি সমস্ত নিয়ামক শ্রেণীর কোডের সাথে (ডিফল্ট মান পেতে এবং সেট করতে) শক্তভাবে মিলিত হয়।
  4. রিসেট বৈশিষ্ট্য শ্রেণি (রিসেটফিউশনভি 2) কন্ট্রোলার শ্রেণির (সামঞ্জস্য) এর অন্য পদ্ধতি অ্যাক্সেস করতে পারে যা অনাকাঙ্ক্ষিত।

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

এখন আপনি ভাবতে শুরু করেছেন যে এই নতুন বৈশিষ্ট্যটি যুক্ত করা হবে সেটি পুনরায় সেট বৈশিষ্ট্যটির সাথে সাদৃশ্যযুক্ত এবং অ্যাপ্লিকেশনগুলির ইস্যু (ভি 2) এর সাথে মিলে যায় যদি আপনি নিজের অ্যাপ্লিকেশনটিকে পুনরায় ফ্যাক্টর না করেন তবে গুণিত হবে।

আপনি উত্তরাধিকার ব্যবহারের কথা ভাবতে শুরু করেন যাতে আপনি জাভা এর পলিমারফিক ক্ষমতা থেকে সুবিধা নিতে পারেন এবং আপনি একটি নতুন বিমূর্ত শ্রেণি (কন্ট্রোলারভি 3) যুক্ত করতে পারেন

  1. গেট অ্যান্ড সেট পদ্ধতির স্বাক্ষর ঘোষণা করুন।
  2. সমন্বিত পদ্ধতি বাস্তবায়ন যা এর আগে সমস্ত নিয়ামকের মধ্যে প্রতিলিপি করা হয়েছিল।
  3. সেটডাফল্ট পদ্ধতিটি ঘোষণা করুন যাতে পুনরায় সেট বৈশিষ্ট্যটি বহুবর্ষবাদ উপকারের মাধ্যমে সহজেই প্রয়োগ করা যায়।

এই উন্নতিগুলির সাথে, আপনার সাথে আপনার টিভি অ্যাপ্লিকেশনটির 3 সংস্করণ প্রস্তুত রয়েছে।

অ্যাপ্লিকেশন সংস্করণ 3

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

abstract class ControllerV3 {
    abstract void set(int value);
    abstract int get();
    void adjust(int value)  {
        int temp = this.get();
        if(((value > 0) && (temp >= 100)) || ((value < 0) && (temp <= 0)))    {
            System.out.println("Can not adjust any further");
            return;
        }
        this.set(temp + value);
    }
    abstract void setDefault();
}
class VolumeControllerV3 extends ControllerV3   {

    private int defaultValue = 25;
    private int value;

    public void setDefault() {
        set(defaultValue);
    }
    int get()    {
        return value;
    }
    void set(int value) {
        System.out.println("Old value of VolumeController \t"+this.value);
        this.value = value;
        System.out.println("New value of VolumeController \t"+this.value);
    }
}
class  BrightnessControllerV3  extends ControllerV3   {

    private int defaultValue = 50;
    private int value;

    public void setDefault() {
        set(defaultValue);
    }
    int get()    {
        return value;
    }
    void set(int value) {
        System.out.println("Old value of BrightnessController \t"+this.value);
        this.value = value;
        System.out.println("New value of BrightnessController \t"+this.value);
    }
}
class ColourControllerV3 extends ControllerV3   {

    private int defaultValue = 40;
    private int value;

    public void setDefault() {
        set(defaultValue);
    }
    int get()    {
        return value;
    }
    void set(int value) {
        System.out.println("Old value of ColourController \t"+this.value);
        this.value = value;
        System.out.println("New value of ColourController \t"+this.value);
    }
}

class ResetFunctionV3 {

    private List<ControllerV3> controllers = null;

    ResetFunctionV3(List<ControllerV3> controllers)  {
        this.controllers = controllers;
    }
    void onReset()    {
        for (ControllerV3 controllerV3 :this.controllers)  {
            controllerV3.setDefault();
        }
    }
}
/*
 *       so on
 *       There can be n number of controllers
 *
 * */
public class TvApplicationV3 {
    public static void main(String[] args)  {
        VolumeControllerV3 volumeControllerV3 = new VolumeControllerV3();
        BrightnessControllerV3 brightnessControllerV3 = new BrightnessControllerV3();
        ColourControllerV3 colourControllerV3 = new ColourControllerV3();

        List<ControllerV3> controllerV3s = new ArrayList<>();
        controllerV3s.add(volumeControllerV3);
        controllerV3s.add(brightnessControllerV3);
        controllerV3s.add(colourControllerV3);

        ResetFunctionV3 resetFunctionV3 = new ResetFunctionV3(controllerV3s);

        OUTER: while(true) {
            Scanner sc=new Scanner(System.in);
            System.out.println(" Enter your option \n Press 1 to increase volume \n Press 2 to decrease volume");
            System.out.println(" Press 3 to increase brightness \n Press 4 to decrease brightness");
            System.out.println(" Press 5 to increase color \n Press 6 to decrease color");
            System.out.println(" Press 7 to reset TV \n Press any other Button to shutdown");
            int button = sc.nextInt();
            switch (button) {
                case  1:    {
                    volumeControllerV3.adjust(5);
                    break;
                }
                case 2: {
                    volumeControllerV3.adjust(-5);
                    break;
                }
                case  3:    {
                    brightnessControllerV3.adjust(5);
                    break;
                }
                case 4: {
                    brightnessControllerV3.adjust(-5);
                    break;
                }
                case  5:    {
                    colourControllerV3.adjust(5);
                    break;
                }
                case 6: {
                    colourControllerV3.adjust(-5);
                    break;
                }
                case 7: {
                    resetFunctionV3.onReset();
                    break;
                }
                default:
                    System.out.println("Shutting down...........");
                    break OUTER;
            }

        }
    }
}

যদিও ভি 2 এর ইস্যু তালিকায় তালিকাভুক্ত বেশিরভাগ ইস্যুকে সম্বোধন করা হয়েছে

টিভি অ্যাপ্লিকেশন সংস্করণ 3 এ ইস্যু

  1. রিসেট বৈশিষ্ট্য শ্রেণি (রিসেটফিউশনভি 3) কন্ট্রোলার শ্রেণির (সামঞ্জস্য) এর অন্য পদ্ধতি অ্যাক্সেস করতে পারে যা অনাকাঙ্ক্ষিত।

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

সুতরাং আপনি বিমূর্ত শ্রেণিতে সংজ্ঞায়িত চুক্তিটি ভাগ করে নিন এবং এর জন্য 2 টি ইন্টারফেস লিখুন

  1. বৈশিষ্ট্য পুনরায় সেট করুন।
  2. ড্রাইভার আপডেট।

এবং আপনার 1 ম কংক্রিট ক্লাসটি নীচের মতগুলি প্রয়োগ করুন

অ্যাপ্লিকেশন সংস্করণ 4

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

interface OnReset {
    void setDefault();
}
interface OnStart {
    void checkForDriverUpdate();
}
abstract class ControllerV4 implements OnReset,OnStart {
    abstract void set(int value);
    abstract int get();
    void adjust(int value)  {
        int temp = this.get();
        if(((value > 0) && (temp >= 100)) || ((value < 0) && (temp <= 0)))    {
            System.out.println("Can not adjust any further");
            return;
        }
        this.set(temp + value);
    }
}

class VolumeControllerV4 extends ControllerV4 {

    private int defaultValue = 25;
    private int value;
    @Override
    int get()    {
        return value;
    }
    void set(int value) {
        System.out.println("Old value of VolumeController \t"+this.value);
        this.value = value;
        System.out.println("New value of VolumeController \t"+this.value);
    }
    @Override
    public void setDefault() {
        set(defaultValue);
    }

    @Override
    public void checkForDriverUpdate()    {
        System.out.println("Checking driver update for VolumeController .... Done");
    }
}
class  BrightnessControllerV4 extends ControllerV4 {

    private int defaultValue = 50;
    private int value;
    @Override
    int get()    {
        return value;
    }
    @Override
    void set(int value) {
        System.out.println("Old value of BrightnessController \t"+this.value);
        this.value = value;
        System.out.println("New value of BrightnessController \t"+this.value);
    }

    @Override
    public void setDefault() {
        set(defaultValue);
    }

    @Override
    public void checkForDriverUpdate()    {
        System.out.println("Checking driver update for BrightnessController .... Done");
    }
}
class ColourControllerV4 extends ControllerV4 {

    private int defaultValue = 40;
    private int value;
    @Override
    int get()    {
        return value;
    }
    void set(int value) {
        System.out.println("Old value of ColourController \t"+this.value);
        this.value = value;
        System.out.println("New value of ColourController \t"+this.value);
    }
    @Override
    public void setDefault() {
        set(defaultValue);
    }

    @Override
    public void checkForDriverUpdate()    {
        System.out.println("Checking driver update for ColourController .... Done");
    }
}
class ResetFunctionV4 {

    private List<OnReset> controllers = null;

    ResetFunctionV4(List<OnReset> controllers)  {
        this.controllers = controllers;
    }
    void onReset()    {
        for (OnReset onreset :this.controllers)  {
            onreset.setDefault();
        }
    }
}
class InitializeDeviceV4 {

    private List<OnStart> controllers = null;

    InitializeDeviceV4(List<OnStart> controllers)  {
        this.controllers = controllers;
    }
    void initialize()    {
        for (OnStart onStart :this.controllers)  {
            onStart.checkForDriverUpdate();
        }
    }
}
/*
*       so on
*       There can be n number of controllers
*
* */
public class TvApplicationV4 {
    public static void main(String[] args)  {
        VolumeControllerV4 volumeControllerV4 = new VolumeControllerV4();
        BrightnessControllerV4 brightnessControllerV4 = new BrightnessControllerV4();
        ColourControllerV4 colourControllerV4 = new ColourControllerV4();
        List<ControllerV4> controllerV4s = new ArrayList<>();
        controllerV4s.add(brightnessControllerV4);
        controllerV4s.add(volumeControllerV4);
        controllerV4s.add(colourControllerV4);

        List<OnStart> controllersToInitialize = new ArrayList<>();
        controllersToInitialize.addAll(controllerV4s);
        InitializeDeviceV4 initializeDeviceV4 = new InitializeDeviceV4(controllersToInitialize);
        initializeDeviceV4.initialize();

        List<OnReset> controllersToReset = new ArrayList<>();
        controllersToReset.addAll(controllerV4s);
        ResetFunctionV4 resetFunctionV4 = new ResetFunctionV4(controllersToReset);

        OUTER: while(true) {
            Scanner sc=new Scanner(System.in);
            System.out.println(" Enter your option \n Press 1 to increase volume \n Press 2 to decrease volume");
            System.out.println(" Press 3 to increase brightness \n Press 4 to decrease brightness");
            System.out.println(" Press 5 to increase color \n Press 6 to decrease color");
            System.out.println(" Press 7 to reset TV \n Press any other Button to shutdown");
            int button = sc.nextInt();
            switch (button) {
                case  1:    {
                    volumeControllerV4.adjust(5);
                    break;
                }
                case 2: {
                    volumeControllerV4.adjust(-5);
                    break;
                }
                case  3:    {
                    brightnessControllerV4.adjust(5);
                    break;
                }
                case 4: {
                    brightnessControllerV4.adjust(-5);
                    break;
                }
                case  5:    {
                    colourControllerV4.adjust(5);
                    break;
                }
                case 6: {
                    colourControllerV4.adjust(-5);
                    break;
                }
                case 7: {
                    resetFunctionV4.onReset();
                    break;
                }
                default:
                    System.out.println("Shutting down...........");
                    break OUTER;
            }

        }
    }
}

এখন আপনার দ্বারা মোকদ্দমার সমস্ত সমস্যার সমাধান হয়ে গেছে এবং আপনি বুঝতে পেরেছেন যে উত্তরাধিকার এবং পলিমারফিজমের ব্যবহারের সাহায্যে আপনি

  1. আবেদনের বিভিন্ন অংশটি শিথিলভাবে একত্রে রাখুন। (রিসেট বা ড্রাইভার আপডেট বৈশিষ্ট্য উপাদানগুলিকে প্রকৃত নিয়ামক শ্রেণীর (ভলিউম, উজ্জ্বলতা এবং রঙ) সম্পর্কে সচেতন করার দরকার নেই, অনারসেট বা অন স্টার্ট প্রয়োগকারী কোনও শ্রেণীর পুনরায় সেট বা ড্রাইভার আপডেট বৈশিষ্ট্যটিতে গ্রহণযোগ্য হবে) উপাদান যথাক্রমে)।
  2. অ্যাপ্লিকেশন বর্ধন সহজতর হয়ে উঠেছে control
  3. বিমূর্ততার স্তরটি রাখুন Now

আশাকরি এটা সাহায্য করবে :-)


3

ওভারলোডিং শব্দটি একই নামের কোনও কিছুর একাধিক সংস্করণকে বোঝায়, সাধারণত বিভিন্ন প্যারামিটারের তালিকা সহ পদ্ধতিগুলি

public int DoSomething(int objectId) { ... }
public int DoSomething(string objectName) { ... }

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

ওভাররাইডিং সাধারণত বহুত্ববাদকে বোঝায়, যেমনটি আপনি আপনার প্রশ্নে বর্ণনা করেছেন


2

অতিরিক্ত লোডিং হ'ল যখন আপনি একই নামের সাথে পৃথক পরামিতিগুলি সহ 2 টি পদ্ধতি নির্ধারণ করেন

ওভাররাইডিং হল যেখানে আপনি একটি সাবক্লাসে একই নামের সাথে একটি ফাংশনের মাধ্যমে বেস শ্রেণীর আচরণ পরিবর্তন করুন।

সুতরাং পলিমারফিজম ওভাররাইডিং সম্পর্কিত তবে সত্যই ওভারলোডিংয়ের সাথে সম্পর্কিত নয়।

তবে যদি কেউ আমাকে "বহুবিজ্ঞান কী?" এই প্রশ্নের জন্য "ওভাররাইডিং" এর একটি সহজ উত্তর দেন? আমি আরও ব্যাখ্যা জিজ্ঞাসা করব।


2

ওভাররাইডিং হ'ল উপরের স্তরের পদ্ধতি (সুপার পদ্ধতি) হিসাবে একই নাম এবং স্বাক্ষর সহ একটি পদ্ধতি ঘোষণা করে উত্তরাধিকার সূত্রে প্রাপ্ত পদ্ধতিটি আড়াল করার মতো, এটি শ্রেণিতে একটি পলিমারফিক আচরণ যুক্ত করে। অন্য কথায় ডাকা উচিত যে উচ্চ স্তরের পদ্ধতি নির্বাচন করার সিদ্ধান্তটি সংকলনের সময় নয় রান সময়ে করা হবে will এটি ইন্টারফেস এবং বাস্তবায়নের ধারণার দিকে পরিচালিত করে।


2

পলিমারফিজম কী?

জাভা টিউটোরিয়াল থেকে

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

উদাহরণ এবং সংজ্ঞা বিবেচনা করে, ওভাররাইডিং উত্তর গ্রহণ করা উচিত।

আপনার দ্বিতীয় প্রশ্ন সম্পর্কিত:

যদি আপনার কোনও অ্যাবস্ট্রাক্ট বেস ক্লাস থাকে যা কোনও প্রয়োগ ছাড়াই একটি পদ্ধতির সংজ্ঞা দেয় এবং আপনি সেই উপ-শ্রেণিতে সেই পদ্ধতিটি সংজ্ঞায়িত করেছেন, তা কি এখনও ওভাররাইডিং হয়?

এটিকে ওভাররাইডিং বলা উচিত।

বিভিন্ন ধরণের ওভাররাইড বোঝার জন্য এই উদাহরণটি দেখুন।

  1. বেস ক্লাস কোনও প্রয়োগকরণ সরবরাহ করে না এবং উপ-শ্রেণীর সম্পূর্ণ পদ্ধতিকে ওভাররাইড করতে হবে - (বিমূর্ত)
  2. বেস ক্লাসটি ডিফল্ট বাস্তবায়ন সরবরাহ করে এবং উপ-শ্রেণি আচরণ পরিবর্তন করতে পারে
  3. উপ-শ্রেণি কল করে বেস ক্লাস বাস্তবায়নে এক্সটেনশন যুক্ত করে super.methodName() প্রথম বিবৃতি হিসাবে
  4. বেস ক্লাসটি অ্যালগরিদমের কাঠামো সংজ্ঞা দেয় (টেমপ্লেট পদ্ধতি) এবং উপ-শ্রেণীর অ্যালগরিদমের একটি অংশকে ওভাররাইড করবে

টুকিটাকি সংকেতলিপি:

import java.util.HashMap;

abstract class Game implements Runnable{

    protected boolean runGame = true;
    protected Player player1 = null;
    protected Player player2 = null;
    protected Player currentPlayer = null;

    public Game(){
        player1 = new Player("Player 1");
        player2 = new Player("Player 2");
        currentPlayer = player1;
        initializeGame();
    }

    /* Type 1: Let subclass define own implementation. Base class defines abstract method to force
        sub-classes to define implementation    
    */

    protected abstract void initializeGame();

    /* Type 2: Sub-class can change the behaviour. If not, base class behaviour is applicable */
    protected void logTimeBetweenMoves(Player player){
        System.out.println("Base class: Move Duration: player.PlayerActTime - player.MoveShownTime");
    }

    /* Type 3: Base class provides implementation. Sub-class can enhance base class implementation by calling
        super.methodName() in first line of the child class method and specific implementation later */
    protected void logGameStatistics(){
        System.out.println("Base class: logGameStatistics:");
    }
    /* Type 4: Template method: Structure of base class can't be changed but sub-class can some part of behaviour */
    protected void runGame() throws Exception{
        System.out.println("Base class: Defining the flow for Game:");  
        while ( runGame) {
            /*
            1. Set current player
            2. Get Player Move
            */
            validatePlayerMove(currentPlayer);  
            logTimeBetweenMoves(currentPlayer);
            Thread.sleep(500);
            setNextPlayer();
        }
        logGameStatistics();
    }
    /* sub-part of the template method, which define child class behaviour */
    protected abstract void validatePlayerMove(Player p);

    protected void setRunGame(boolean status){
        this.runGame = status;
    }
    public void setCurrentPlayer(Player p){
        this.currentPlayer = p;
    }
    public void setNextPlayer(){
        if ( currentPlayer == player1) {
            currentPlayer = player2;
        }else{
            currentPlayer = player1;
        }
    }
    public void run(){
        try{
            runGame();
        }catch(Exception err){
            err.printStackTrace();
        }
    }
}

class Player{
    String name;
    Player(String name){
        this.name = name;
    }
    public String getName(){
        return name;
    }
}

/* Concrete Game implementation  */
class Chess extends Game{
    public Chess(){
        super();
    }
    public void initializeGame(){
        System.out.println("Child class: Initialized Chess game");
    }
    protected void validatePlayerMove(Player p){
        System.out.println("Child class: Validate Chess move:"+p.getName());
    }
    protected void logGameStatistics(){
        super.logGameStatistics();
        System.out.println("Child class: Add Chess specific logGameStatistics:");
    }
}
class TicTacToe extends Game{
    public TicTacToe(){
        super();
    }
    public void initializeGame(){
        System.out.println("Child class: Initialized TicTacToe game");
    }
    protected void validatePlayerMove(Player p){
        System.out.println("Child class: Validate TicTacToe move:"+p.getName());
    }
}

public class Polymorphism{
    public static void main(String args[]){
        try{

            Game game = new Chess();
            Thread t1 = new Thread(game);
            t1.start();
            Thread.sleep(1000);
            game.setRunGame(false);
            Thread.sleep(1000);

            game = new TicTacToe();
            Thread t2 = new Thread(game);
            t2.start();
            Thread.sleep(1000);
            game.setRunGame(false);

        }catch(Exception err){
            err.printStackTrace();
        }       
    }
}

আউটপুট:

Child class: Initialized Chess game
Base class: Defining the flow for Game:
Child class: Validate Chess move:Player 1
Base class: Move Duration: player.PlayerActTime - player.MoveShownTime
Child class: Validate Chess move:Player 2
Base class: Move Duration: player.PlayerActTime - player.MoveShownTime
Base class: logGameStatistics:
Child class: Add Chess specific logGameStatistics:
Child class: Initialized TicTacToe game
Base class: Defining the flow for Game:
Child class: Validate TicTacToe move:Player 1
Base class: Move Duration: player.PlayerActTime - player.MoveShownTime
Child class: Validate TicTacToe move:Player 2
Base class: Move Duration: player.PlayerActTime - player.MoveShownTime
Base class: logGameStatistics:

2

আমার মনে হয় ছেলেরা আপনার ধারণার মিশ্রণ করছে। পলিমারফিজম হ'ল চালুর সময় কোনও বস্তুর আলাদা আচরণ করার ক্ষমতা। এটি অর্জনের জন্য আপনার দুটি প্রয়োজনীয় প্রয়োজন:

  1. দেরীতে বাঁধাই
  2. উত্তরাধিকার।

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

তবে সি ++ তে তা হয় না। যে কোনও ওভারলোডেড পদ্ধতি, স্বাক্ষরটি একই বা না (স্বতন্ত্র পরিমাণ, বিভিন্ন ধরণের) পাশাপাশি ওভাররাইড করা হয় । আজকের দিনে, বেস ক্লাস 'পদ্ধতিটি সাবক্লাসে আর উপলভ্য নয় যখন সাবক্লাস অবজেক্টের বাইরে থেকে ডাকা হবে।

উত্তরটি জাভা ব্যবহারের ওভারলোডিং সম্পর্কে কথা বলার সময় হয় । অন্য যে কোনও ভাষাতে সি ++ তে যেমন আলাদা হতে পারে


1

পলিমারফিজম যতটা সম্ভব এর অর্থ সম্পর্কিত ... জাভাতে ওভাররিডিংয়ের পক্ষে

এগুলি সমস্ত পরিস্থিতিতে একই পরিস্থিতিতে একই আচরণের বিভিন্ন বিষয় (প্রোগ্রামিংয়ের উপায়ে ... আপনি বিভিন্ন যুক্তি বলতে পারেন)

আমি মনে করি নীচের উদাহরণটি আপনাকে বুঝতে সাহায্য করবে ... যদিও এটি নিখুঁত জাভা কোড নয় ...

     public void See(Friend)
     {
        System.out.println("Talk");
     }

তবে আমরা যদি তর্কটি পরিবর্তন করি ... আচরণটি বদলে যাবে ...

     public void See(Enemy)
     {
        System.out.println("Run");
     }

ব্যক্তি (এখানে "অবজেক্ট") একই ...


1

পলিমারফিজম কোনও বস্তুর একাধিক বাস্তবায়ন বা আপনি কোনও বস্তুর একাধিক রূপ বলতে পারেন। আসুন আপনাকে Animalsবিমূর্ত বেস শ্রেণি হিসাবে শ্রেণি আছে এবং এটির একটি পদ্ধতি রয়েছে movement()যা প্রাণীটি যেভাবে চলবে তার উপায় নির্ধারণ করে। এখন বাস্তবে আমাদের বিভিন্ন ধরণের প্রাণী রয়েছে এবং তাদের আলাদা আলাদাভাবে সরানো হয়েছে পাশাপাশি তাদের মধ্যে দুটি পা রয়েছে, অন্যরা 4 রয়েছে এবং কিছু পা নেই ইত্যাদি etc movement()পৃথিবীতে প্রতিটি প্রাণীর বিভিন্ন সংজ্ঞা দিতে আমাদের পলিমারফিজম প্রয়োগ করতে হবে। তবে আপনাকে আরও ক্লাসের অর্থ যেমন শ্রেণি Dogs Cats Fishইত্যাদি নির্ধারণ করতে হবে তারপরে আপনাকে অবশ্যই এই শ্রেণিগুলি বেস শ্রেণি থেকে প্রসারিত করতে হবে Animalsএবং এর পদ্ধতিটি ওভাররাইড করতে হবেmovement() আপনার প্রতিটি প্রাণীর উপর ভিত্তি করে একটি নতুন আন্দোলনের কার্যকারিতা সহ করতে হবে। আপনি ব্যবহার করতে পারেনInterfacesযে অর্জন করতে। এখানে মূলশব্দটি ওভাররাইডিং, ওভারলোডিং আলাদা এবং বহুবিজ্ঞান হিসাবে বিবেচিত হয় না। ওভারলোডিংয়ের মাধ্যমে আপনি একাধিক পদ্ধতি "একই নামের সাথে" একই শব্দ বা শ্রেণীর বিভিন্ন পরামিতি সংজ্ঞায়িত করতে পারেন।


0

পলিমারফিজমটি একটি একক ইন্টারফেস ব্যবহার করে কোনও ভাষার আলাদা আলাদা বস্তু সমানভাবে আচরণের দক্ষতার সাথে সম্পর্কিত; যেমন এটি ওভাররাইডিং সম্পর্কিত, সুতরাং ইন্টারফেস (বা বেস ক্লাস) বহুরূপী, বাস্তবায়নকারী হ'ল বস্তু যা ওভাররাইড করে (একই পদকের দুটি মুখ)

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

class animal {
    public void makeRumor(){
        print("thump");
    }
}
class dog extends animal {
    public void makeRumor(){
        print("woff");
    }
}

animal a = new dog();
dog b = new dog();

a.makeRumor() -> prints thump
b.makeRumor() -> prints woff

(ধরুন যে MakeRumor ভার্চুয়াল নয়)

জাভা সত্যিই এই স্তরের বহুবর্ষকে অফার করে না (যাকে বস্তু স্লাইসিংও বলা হয়)।

প্রাণী a = নতুন কুকুর (); কুকুর খ = নতুন কুকুর ();

a.makeRumor() -> prints thump
b.makeRumor() -> prints woff

উভয় ক্ষেত্রে এটি কেবল woff মুদ্রণ করবে .. যেহেতু a এবং b ক্লাস কুকুরকে উল্লেখ করছে



প্রাণী a = নতুন কুকুর (); ক একটি কুকুর হিসাবে নির্মিত হয়েছিল, এবং "ওয়াফ" মুদ্রণ করবে। আপনি যদি এটি থম্প্প মুদ্রণ করতে চান তবে আপনাকে এটি উজান করা দরকার (((প্রাণী) ক) .মেকিউমার ()
ক্রিস কুডমোর

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

এটা বের করে আনা। প্রশ্ন ছিল জাভা ট্যাগ। আপনি সি ++ উত্তর দিয়েছেন। আপনি সি ++ এ সঠিক হতে পারেন। আমি অবশ্যই জাভাতে সঠিক।
ক্রিস চডমোর

প্রতিবার কোনও অনুলিপি নির্মাণকারী এখানে জড়িত হওয়া উচিত, এখানে একটি রেফারেন্স ফ্রেডোসরাস / নোটস- সিপি / ইওপি-কনডেস্ট্রাক্টর /… তিনটি ম্যাচ থাকে; নতুন অপারেটরটিকে অগ্রাহ্য করুন যা কেবলমাত্র সৃষ্টিকে অসন্তুষ্ট করার জন্য রয়েছে।
লোরেঞ্জো বোকাক্সিয়া

0
import java.io.IOException;

class Super {

    protected Super getClassName(Super s) throws IOException {
        System.out.println(this.getClass().getSimpleName() + " - I'm parent");
        return null;
    }

}

class SubOne extends Super {

    @Override
    protected Super getClassName(Super s)  {
        System.out.println(this.getClass().getSimpleName() + " - I'm Perfect Overriding");
        return null;
    }

}

class SubTwo extends Super {

    @Override
    protected Super getClassName(Super s) throws NullPointerException {
        System.out.println(this.getClass().getSimpleName() + " - I'm Overriding and Throwing Runtime Exception");
        return null;
    }

}

class SubThree extends Super {

    @Override
    protected SubThree getClassName(Super s) {
        System.out.println(this.getClass().getSimpleName()+ " - I'm Overriding and Returning SubClass Type");
        return null;
    }

}

class SubFour extends Super {

    @Override
    protected Super getClassName(Super s) throws IOException {
        System.out.println(this.getClass().getSimpleName()+ " - I'm Overriding and Throwing Narrower Exception ");
        return null;
    }

}

class SubFive extends Super {

    @Override
    public Super getClassName(Super s) {
        System.out.println(this.getClass().getSimpleName()+ " - I'm Overriding and have broader Access ");
        return null;
    }

}

class SubSix extends Super {

    public Super getClassName(Super s, String ol) {
        System.out.println(this.getClass().getSimpleName()+ " - I'm Perfect Overloading ");
        return null;
    }

}

class SubSeven extends Super {

    public Super getClassName(SubSeven s) {
        System.out.println(this.getClass().getSimpleName()+ " - I'm Perfect Overloading because Method signature (Argument) changed.");
        return null;
    }

}

public class Test{

    public static void main(String[] args) throws Exception {

        System.out.println("Overriding\n");

        Super s1 = new SubOne(); s1.getClassName(null);

        Super s2 = new SubTwo(); s2.getClassName(null);

        Super s3 = new SubThree(); s3.getClassName(null);

        Super s4 = new SubFour(); s4.getClassName(null);

        Super s5 = new SubFive(); s5.getClassName(null);

        System.out.println("Overloading\n");

        SubSix s6 = new SubSix(); s6.getClassName(null, null);

        s6 = new SubSix(); s6.getClassName(null);

        SubSeven s7 = new SubSeven(); s7.getClassName(s7);

        s7 = new SubSeven(); s7.getClassName(new Super());

    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.