tl; dr - স্থানীয় ব্যাপ্তিতেChild
ওভার ব্যবহারParent
করা ভাল। এটি কেবল পাঠযোগ্যতার সাথেই সহায়তা করে না, তবে এটিও নিশ্চিত করা দরকার যে ওভারলোডেড পদ্ধতি রেজোলিউশনটি সঠিকভাবে কাজ করে এবং দক্ষ সংকলন সক্ষম করতে সহায়তা করে।
স্থানীয় সুযোগে,
Parent obj = new Child(); // Works
Child obj = new Child(); // Better
var obj = new Child(); // Best
ধারণামূলকভাবে, এটি সর্বাধিক ধরণের তথ্য বজায় রাখা সম্পর্কে। যদি আমরা এটিকে ডাউনগ্রেড করি তবে আমরা Parent
মূলত এমন ধরণের তথ্যই সরিয়ে আছি যা দরকারী হতে পারে।
সম্পূর্ণ ধরণের তথ্য ধরে রাখার চারটি প্রধান সুবিধা রয়েছে:
- সংকলক আরও তথ্য সরবরাহ করে।
- পাঠককে আরও তথ্য সরবরাহ করে।
- ক্লিনার, আরও মানক কোড।
- প্রোগ্রামটির যুক্তিটিকে আরও পরিবর্তনযোগ্য করে তোলে।
সুবিধা 1: সংকলক আরও তথ্য
আপাত প্রকারটি ওভারলোডেড পদ্ধতির রেজোলিউশনে এবং অনুকূলিতকরণে ব্যবহৃত হয়।
উদাহরণ: ওভারলোডেড পদ্ধতির রেজোলিউশন
main()
{
Parent parent = new Child();
foo(parent);
Child child = new Child();
foo(child);
}
foo(Parent arg) { /* ... */ } // More general
foo(Child arg) { /* ... */ } // Case-specific optimizations
উপরের উদাহরণে, উভয় foo()
কলগুলি কাজ করে তবে একটি ক্ষেত্রে আমরা আরও ভাল লোড পদ্ধতির রেজোলিউশন পাই।
উদাহরণ: সংকলক অপ্টিমাইজেশন
main()
{
Parent parent = new Child();
var x = parent.Foo();
Child child = new Child();
var y = child .Foo();
}
class Parent
{
virtual int Foo() { return 1; }
}
class Child : Parent
{
sealed override int Foo() { return 2; }
}
উপরের উদাহরণে, উভয় .Foo()
কলই শেষ পর্যন্ত একই override
পদ্ধতিতে কল করে 2
। কেবলমাত্র, প্রথম ক্ষেত্রে, সঠিক পদ্ধতিটি সন্ধান করার জন্য একটি ভার্চুয়াল পদ্ধতি অনুসন্ধান রয়েছে; এই ভার্চুয়াল পদ্ধতিটি অনুসন্ধানের পদ্ধতিটি দ্বিতীয় ক্ষেত্রে প্রয়োজন নেই sealed
।
@ বেনকে ক্রেডিট করুন যিনি তার উত্তরে একই উদাহরণ দিয়েছেন ।
সুবিধা 2: পাঠকের আরও তথ্য
সঠিক ধরণটি জানার অর্থ Child
, যিনি কোডটি পড়ছেন তার আরও বেশি তথ্য সরবরাহ করে, প্রোগ্রামটি কী করছে তা আরও সহজ করে তোলে।
অবশ্যই, সম্ভবত এটি উভয় থেকেই আসল কোডের সাথে কিছু যায় আসে না parent.Foo();
child.Foo();
গুরুত্ব এবং বোঝায়, তবে প্রথমবারের মতো কোডটি দেখার জন্য কারও কাছে আরও তথ্যের সাদামাটা সহায়ক।
অতিরিক্তভাবে, আপনার বিকাশের পরিবেশের উপর নির্ভর করে আইডিই প্রায় আরও সহায়ক সরঞ্জামদণ্ড এবং মেটাডেটা সরবরাহ করতে সক্ষম হতে পারে Child
চেয়েParent
।
সুবিধা 3: ক্লিনার, আরও মানক কোড
আমি ইদানীং ব্যবহার করা সি-কোড উদাহরণগুলির বেশিরভাগই var
মূলত শর্টহ্যান্ড Child
।
Parent obj = new Child(); // Sub-optimal
Child obj = new Child(); // Optimal, but anti-pattern syntax
var obj = new Child(); // Optimal, clean, patterned syntax "everyone" uses now
অ- var
ঘোষণাপত্রের বিবৃতি দেখলে তা বন্ধ হয়ে যায়; যদি এর কোনও পরিস্থিতিগত কারণ থাকে, দুর্দান্ত, তবে অন্যথায় এটি অ্যান্টি-প্যাটার্ন দেখায়।
// Clean:
var foo1 = new Person();
var foo2 = new Job();
var foo3 = new Residence();
// Staggered:
Person foo1 = new Person();
Job foo2 = new Job();
Residence foo3 = new Residence();
সুবিধা 4: প্রোটোটাইপিংয়ের জন্য আরও পরিবর্তনীয় প্রোগ্রামের যুক্তি
প্রথম তিনটি সুবিধা ছিল বড়গুলি; এটি একের থেকে অনেক বেশি পরিস্থিতিগত।
তবুও, অন্যদের মতো কোড ব্যবহার করা লোকেরা এক্সেল ব্যবহার করে, আমরা ক্রমাগত আমাদের কোড পরিবর্তন করি। হয়তো আমরা একটি পদ্ধতি অনন্য কল করার প্রয়োজন হবে না Child
যে এই কোডের সংস্করণ, কিন্তু আমরা repurpose বা পরে কোড rework পারে।
একটি শক্তিশালী টাইপ সিস্টেমের সুবিধা হ'ল এটি আমাদের প্রোগ্রামের যুক্তি সম্পর্কে কিছু নির্দিষ্ট মেটা-ডেটা সরবরাহ করে, সম্ভাবনাগুলিকে আরও সহজেই স্পষ্ট করে তোলে। প্রোটোটাইপিংয়ে এটি অবিশ্বাস্যভাবে কার্যকর, তাই এটি যেখানে সম্ভব সেখানে রাখা ভাল to
সারাংশ
ব্যবহার Parent
মেসস আপ ওভারলোডেড পদ্ধতি রেজোলিউশন কিছু সংকলক অনুকূলকরণ বাধা দেয়, পাঠকের কাছ থেকে তথ্য সরিয়ে দেয় এবং কোডটি আরও খারাপ করে তোলে।
ব্যবহার var
করা সত্যিই যাওয়ার উপায়। এটি দ্রুত, পরিষ্কার, প্যাটার্নযুক্ত এবং সংকলক এবং আইডিইকে তাদের কাজটি সঠিকভাবে করতে সহায়তা করে।
গুরুত্বপূর্ণ : এই উত্তরটিকোনও পদ্ধতির স্থানীয় স্কোপেপ্রায়Parent
বনামChild
। Parent
বনামেরইস্যুটিChild
রিটার্নের ধরণ, যুক্তি এবং শ্রেণীর ক্ষেত্রে খুব আলাদা very