বেস টাইপের পদ্ধতি " virtual
" ঘোষণার মধ্যে এবং "চাইল্ড টাইপের সাথে ম্যাচিং পদ্ধতিটি ঘোষণার সময় override
" new
"কীওয়ার্ডটি ব্যবহার করার বিপরীতে " "কীওয়ার্ড ব্যবহার করে কোনও শিশু টাইপের মধ্যে ওভাররাইড করার মধ্যে কী পার্থক্য রয়েছে ?
বেস টাইপের পদ্ধতি " virtual
" ঘোষণার মধ্যে এবং "চাইল্ড টাইপের সাথে ম্যাচিং পদ্ধতিটি ঘোষণার সময় override
" new
"কীওয়ার্ডটি ব্যবহার করার বিপরীতে " "কীওয়ার্ড ব্যবহার করে কোনও শিশু টাইপের মধ্যে ওভাররাইড করার মধ্যে কী পার্থক্য রয়েছে ?
উত্তর:
"নতুন" কীওয়ার্ডটি ওভাররাইড করে না, এটি একটি নতুন পদ্ধতিকে বোঝায় যা বেস ক্লাস পদ্ধতির সাথে কোনও সম্পর্ক রাখে না।
public class Foo
{
public bool DoSomething() { return false; }
}
public class Bar : Foo
{
public new bool DoSomething() { return true; }
}
public class Test
{
public static void Main ()
{
Foo test = new Bar ();
Console.WriteLine (test.DoSomething ());
}
}
এটি মিথ্যা প্রিন্ট করে, আপনি যদি ওভাররাইড ব্যবহার করেন তবে এটি সত্যই মুদ্রিত হত।
(জোসেফ ডাইগলের কাছ থেকে নেওয়া বেস কোড)
সুতরাং, যদি আপনি প্রকৃত পলিমারফিজম করছেন তবে আপনার অবশ্যই সর্বদা .র্ধ্বমুখী হওয়া উচিত । আপনার কেবলমাত্র "নতুন" ব্যবহার করার দরকারের জায়গাটি যখন পদ্ধতিটি কোনওভাবে কোনও শ্রেণীর সংস্করণের সাথে সম্পর্কিত না হয়।
virtual
বেস এবং override
উদ্ভূত হয়? কেন এটি বিদ্যমান? কোডটি এখনও ডাব্লু / ও পর্যন্ত চলবে new
- সুতরাং এটি কি খাঁটিভাবে কেবল পঠনযোগ্যতা?
আমি সবসময় ছবিগুলির মাধ্যমে আরও সহজে বোঝা যায় এমন জিনিসগুলি দেখতে পাই:
আবার জোসেফ ডাইগলের কোড নিচ্ছেন,
public class Foo
{
public /*virtual*/ bool DoSomething() { return false; }
}
public class Bar : Foo
{
public /*override or new*/ bool DoSomething() { return true; }
}
আপনি যদি তখন কোডটি কল করেন:
Foo a = new Bar();
a.DoSomething();
দ্রষ্টব্য: গুরুত্বপূর্ণ বিষয়টি হ'ল আমাদের অবজেক্টটি আসলে একটি Bar
তবে আমরা এটি একটি ধরণের ভেরিয়েবলে সংরক্ষণ করিFoo
( এটি এটি ingালাইয়ের অনুরূপ)
তারপরে ফলাফলটি আপনি virtual
/ override
বা new
আপনার ক্লাসগুলি ঘোষণার সময় ব্যবহার করেছেন কিনা তার উপর নির্ভর করে নীচে থাকবে ।
ভার্চুয়াল এবং অ-ভার্চুয়াল পদ্ধতির আচরণের পার্থক্য বুঝতে এখানে কিছু কোড রয়েছে:
class A
{
public void foo()
{
Console.WriteLine("A::foo()");
}
public virtual void bar()
{
Console.WriteLine("A::bar()");
}
}
class B : A
{
public new void foo()
{
Console.WriteLine("B::foo()");
}
public override void bar()
{
Console.WriteLine("B::bar()");
}
}
class Program
{
static int Main(string[] args)
{
B b = new B();
A a = b;
a.foo(); // Prints A::foo
b.foo(); // Prints B::foo
a.bar(); // Prints B::bar
b.bar(); // Prints B::bar
return 0;
}
}
new
বেস পদ্ধতি "লুকানোর" জন্য ব্যবহার করবেন, যখন কেবল ওভাররাইড ব্যবহার না করে একই কাজ করা হয়?
virtual
এবং সংকলক অভিযোগ করবে যদি কোনও শ্রেণি "ব্লাডলাইন" তে একই ফাংশনের নামটি virtual
স্বাক্ষরবিহীন
new
শব্দ আসলে একটি সম্পূর্ণ নতুন সদস্য যে শুধুমাত্র নির্দিষ্ট ধরনের উপর বিদ্যমান সৃষ্টি করে।
এই ক্ষেত্রে
public class Foo
{
public bool DoSomething() { return false; }
}
public class Bar : Foo
{
public new bool DoSomething() { return true; }
}
পদ্ধতি উভয় প্রকারে বিদ্যমান। আপনি যখন প্রতিবিম্ব ব্যবহার করেন এবং প্রকারের সদস্যগুলি পান Bar
, আপনি আসলে 2 টি পদ্ধতি খুঁজে পাবেন DoSomething()
যা একেবারে একই চেহারা বলে । new
বেস ক্লাসে কার্যকরভাবে প্রয়োগটি গোপন করে আপনার ব্যবহার করে , যাতে ক্লাসগুলি যখন Bar
(আমার উদাহরণস্বরূপ) থেকে প্রাপ্ত হয় তখন মেথড কলটি যেভাবে base.DoSomething()
আসে Bar
এবং না Foo
।
ভার্চুয়াল / ওভাররাইড সংস্থাপককে বলে যে দুটি পদ্ধতি সম্পর্কিত এবং কিছু পরিস্থিতিতে যখন আপনি মনে করবেন যে আপনি প্রথম (ভার্চুয়াল) পদ্ধতিটি কল করছেন এটি পরিবর্তে দ্বিতীয় (ওভাররাইড) পদ্ধতিতে কল করা ঠিক। এটি পলিমারফিজমের ভিত্তি।
(new SubClass() as BaseClass).VirtualFoo()
সাবক্লাসের ওভারডিডেন ভার্চুয়ালফু () পদ্ধতিতে কল করবে।
নতুন সংকলককে বলে যে আপনি বেস শ্রেণিতে একটি পদ্ধতি হিসাবে একই নামের সাথে একটি উত্পন্ন শ্রেণিতে একটি পদ্ধতি যুক্ত করছেন, তবে তাদের একে অপরের সাথে কোনও সম্পর্ক নেই।
(new SubClass() as BaseClass).NewBar()
বেসক্লাসের নতুনবার () পদ্ধতিতে কল করবে, যেখানে:
(new SubClass()).NewBar()
সাবক্লাসের নতুনবার () পদ্ধতিতে কল করবে।
কেবল প্রযুক্তিগত বিশদ ছাড়াই আমি মনে করি ভার্চুয়াল / ওভাররাইড ব্যবহার করে ডিজাইনে প্রচুর অর্থবোধক তথ্য যোগাযোগ করা হয়। আপনি যখন কোনও পদ্ধতি ভার্চুয়াল ঘোষণা করেন, আপনি নির্দেশিত হন যে বাস্তবায়নকারী ক্লাসগুলি তাদের নিজস্ব, অ-ডিফল্ট বাস্তবায়ন সরবরাহ করতে চাইতে পারে expect এটি একটি বেস ক্লাসে ছেড়ে দেওয়া, একইভাবে, প্রত্যাশা ঘোষণা করে যে ডিফল্ট পদ্ধতিটি সমস্ত বাস্তবায়নকারী শ্রেণীর জন্য যথেষ্ট হবে। একইভাবে, কেউ বাস্তবায়নকারী ক্লাসগুলিকে তাদের নিজস্ব বাস্তবায়ন সরবরাহ করতে বাধ্য করার জন্য বিমূর্ত ঘোষণাগুলি ব্যবহার করতে পারেন। আবার, আমি মনে করি এটি প্রোগ্রামার কোডটি কীভাবে ব্যবহার করবে বলে আশা করে সে সম্পর্কে অনেক যোগাযোগ করে। আমি যদি বেস এবং প্রয়োগকারী ক্লাস উভয়ই লিখতে থাকি এবং নিজেকে নতুন ব্যবহার করতে দেখি আমি পিতামাতার মধ্যে পদ্ধতিটি ভার্চুয়াল না করার সিদ্ধান্তটি গুরুত্বের সাথে পুনর্বিবেচনা করব এবং আমার উদ্দেশ্যটি বিশেষভাবে ঘোষণা করব
আমার ব্যাখ্যাটির সংস্করণটি পার্থক্যগুলি বুঝতে সহায়তা করার জন্য বৈশিষ্ট্যগুলি ব্যবহার করে আসে ।
override
যথেষ্ট সহজ, তাই না? অন্তর্নিহিত প্রকারটি পিতামাতারকে ওভাররাইড করে।
new
সম্ভবত বিভ্রান্তিকর (আমার জন্য এটি ছিল)। বৈশিষ্ট্য সহ এটি বোঝা সহজ:
public class Foo
{
public bool GetSomething => false;
}
public class Bar : Foo
{
public new bool GetSomething => true;
}
public static void Main(string[] args)
{
Foo foo = new Bar();
Console.WriteLine(foo.GetSomething);
Bar bar = new Bar();
Console.WriteLine(bar.GetSomething);
}
একটি ডিবাগার ব্যবহার করে আপনি যে লক্ষ্য করতে Foo foo
হয়েছে 2 GetSomething
, বৈশিষ্ট্য যেমন আসলে সম্পত্তির 2 সংস্করণ রয়েছে Foo
's এবং Bar
' s, এবং জানেন যে যা ব্যবহার করার জন্য এক, গ # "অকার্যকর" বর্তমান টাইপ জন্য সম্পত্তি।
আপনি যদি বারটির সংস্করণটি ব্যবহার করতে চান তবে আপনি ওভাররাইড বা Foo foo
পরিবর্তে ব্যবহার করতে পারতেন ।
Bar bar
এটির জন্য কেবল 1 রয়েছে , কারণ এটি সম্পূর্ণ নতুন আচরণ চায় GetSomething
।
কোনও কিছুর সাথে কোনও পদ্ধতি চিহ্নিত না করার অর্থ: অবজেক্টের কম্পাইল টাইপ ব্যবহার করে এই পদ্ধতিটি বেঁধে রাখুন, রানটাইম টাইপ নয় (স্ট্যাটিক বাইন্ডিং)।
কোনও পদ্ধতিকে virtual
অর্থ সহ চিহ্নিত করা : অবজেক্টের রানটাইম টাইপ ব্যবহার করে এই পদ্ধতিটি বেঁধে রাখুন, টাইপ টাইপ (ডায়নামিক বাইন্ডিং) সংকলন করবেন না।
উত্সযুক্ত শ্রেণীর virtual
সাথে একটি বেস শ্রেণীর পদ্ধতি চিহ্নিত করার override
অর্থ: অবজেক্টের রানটাইম টাইপ (গতিশীল বাঁধাই) ব্যবহার করে আবদ্ধ হওয়া এই পদ্ধতি।
উত্সযুক্ত শ্রেণীর virtual
সাথে একটি বেস শ্রেণীর পদ্ধতি চিহ্নিত করার new
অর্থ: এটি একটি নতুন পদ্ধতি, যার বেস শ্রেণিতে একই নামটির সাথে কোনও সম্পর্ক নেই এবং এটি অবজেক্টের সংকলন টাইম টাইপ (স্ট্যাটিক বাইন্ডিং) ব্যবহার করে আবদ্ধ হওয়া উচিত।
virtual
উত্পন্ন শ্রেণিতে একটি বেস শ্রেণীর পদ্ধতি চিহ্নিত না করার অর্থ: এই পদ্ধতিটি new
(স্ট্যাটিক বাইন্ডিং) হিসাবে চিহ্নিত করা হয় ।
একটি পদ্ধতি চিহ্নিত করার abstract
অর্থ: এই পদ্ধতিটি ভার্চুয়াল, তবে আমি এটির জন্য কোনও বডি ঘোষণা করব না এবং এর শ্রেণিটিও বিমূর্ত (গতিশীল বাঁধাই)।
new
একই নামের সাথে একটি নতুন সদস্য তৈরি করে এবং আসল সদস্যকে গোপনে পরিণত করে,override
উত্তরাধিকার সূত্রে প্রাপ্ত সদস্যের জন্য প্রয়োগকে প্রসারিত করে"