আমি স্থির ক্লাস কেন অধিকার করতে পারি না?


224

আমার বেশ কয়েকটি ক্লাস রয়েছে যা আসলে কোনও রাজ্যের দরকার নেই need সাংগঠনিক দৃষ্টিকোণ থেকে, আমি তাদের স্তরক্রমের মধ্যে রাখতে চাই।

তবে মনে হচ্ছে স্থির শ্রেণীর জন্য আমি উত্তরাধিকার ঘোষণা করতে পারি না।

এরকম কিছু:

public static class Base
{
}

public static class Inherited : Base
{
}

কাজ করবে না.

ভাষার ডিজাইনাররা কেন সেই সম্ভাবনাটি বন্ধ করে দিয়েছেন?


উত্তর:


174

এখান থেকে উদ্ধৃতি :

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

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

(ম্যাডস টর্গারসেন, সি # ভাষার প্রধানমন্ত্রী)

চ্যানেল 9 এর অন্যান্য মতামত

.NET- এ উত্তরাধিকার কেবলমাত্র উদাহরণ ভিত্তিতে কাজ করে। স্ট্যাটিক পদ্ধতিগুলি প্রকারের স্তরে উদাহরণস্বরূপ স্তরে নয়। এজন্য ওভাররাইড স্থিতিশীল পদ্ধতি / বৈশিষ্ট্য / ইভেন্টগুলি নিয়ে কাজ করে না ...

স্থির পদ্ধতিগুলি মেমরিতে কেবল একবার অনুষ্ঠিত হয়। তাদের জন্য তৈরি করা ভার্চুয়াল টেবিল ইত্যাদি নেই।

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

(Littleguru)

এবং একটি মূল্যবান ধারণা হিসাবে, লিটলগুরুর এই ইস্যুটির জন্য একটি আংশিক "কার্যকরী" রয়েছে: একক প্যাটার্ন।


92
টর্গারসনের পক্ষে কল্পনার অভাব, সত্যই। এটি করার জন্য আমার কাছে বেশ ভাল কারণ ছিল :)
থোরেইন

10
এ কেমন? আপনার কাছে এমন একটি ডিল রয়েছে যা ওপেন সোর্স নয় / আপনি এর উত্সটিতে অ্যাক্সেস পাবেন না, আসুন নুনিট বলুন। থ্রো <> (অ্যাকশন এ) এর মতো পদ্ধতি থাকতে আপনি এটির ক্লাসটি প্রসারিত করতে চান (হ্যাঁ, এটি সেখানেও রয়েছে, তবে এক পর্যায়ে এটি ছিল না)) আপনি আপনার প্রকল্পে একটি যুক্তি যুক্ত করতে পারেন: নুনিট.ফ্রেমওয়ার্ক Aআসার্ট ক্লাস, এবং তারপরে একটি থ্রো পদ্ধতি যুক্ত করুন। সমস্যা সমাধান. কোডেও এটি ব্যবহার করা আরও পরিষ্কার ... অন্য ক্লাসের নাম নিয়ে আসার পরিবর্তে এবং সেই ক্লাসের নামটি মনে রাখতে হবে, কেবল সন্নিবেশ টাইপ করুন। এবং উপলব্ধ পদ্ধতি দেখুন।
ব্যবহারকারী420667

4
@ কনরাডমোরাউস্কি স্থিত শ্রেণীর জন্য এক্সটেনশন পদ্ধতিগুলি লেখা অসম্ভব। stackoverflow.com/questions/249222/…
মার্টিন ব্রাউন

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

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

71

আপনি স্থিতিশীল শ্রেণীর উত্তরাধিকারী হতে না পারার মূল কারণ হ'ল এগুলি বিমূর্ত এবং সীলমোহর করা (এটি তাদের কোনও ঘটনা তৈরি হতে বাধা দেয়)।

আমার স্নাতকের:

static class Foo { }

এই আইএল সংকলন:

.class private abstract auto ansi sealed beforefieldinit Foo
  extends [mscorlib]System.Object
 {
 }

17
আপনি বলছেন যে স্ট্যাটিকটি বিমূর্ত + সিল হিসাবে প্রয়োগ করা হয়েছিল। কেন এটি করা হয়েছিল তা জানতে চান তিনি । কেন এটি সিল করা হয়?
লুকাস

22
এটি প্রশ্নের সমস্ত উত্তর দেয় না; এটি কেবল যে বিষয়ে তিনি জিজ্ঞাসা করেছিলেন তা পুনরুদ্ধার করে।
ইগবি লার্জম্যান

27
ঠিক আছে, ওপিকে "স্ট্যাটিক ক্লাস কেন সিল করা হয়েছে" জিজ্ঞাসা করা উচিত ছিল না, "কেন আমি স্ট্যাটিক ক্লাস থেকে উত্তরাধিকারী হতে পারি না?", যার উত্তর অবশ্যই "কারণ তারা সিল করা হয়েছে" । এই উত্তরটি আমার ভোট পায়।
অ্যালেক্স বুদোভস্কি

6
ভাগ করে নেওয়ার জন্য ধন্যবাদ যে স্ট্যাটিক ক্লাসগুলি স্বয়ংক্রিয়ভাবে সিল করা ক্লাস হিসাবে সংকলিত হয় - আমি ভাবছিলাম যে কখন / কখন ঘটেছিল!
চিহ্নিত করুন

22
@ অ্যালেক্স বুদোভস্কি: এই উত্তরটি সঠিক হলেও একজন হারিয়ে যাওয়া ব্যক্তিকে "আপনি আমার সামনে আছেন" যখন তারা আপনাকে "আমি কোথায় আছি" জিজ্ঞাসা করার মতো অকেজো।
ডিপস্পেস 101

24

এটি এইভাবে চিন্তা করুন: আপনি টাইপ নামের মাধ্যমে স্থির সদস্যদের অ্যাক্সেস করুন:

MyStaticType.MyStaticMember();

আপনি যদি সেই শ্রেণি থেকে উত্তরাধিকারী হন তবে আপনাকে নতুন ধরণের নামের মাধ্যমে এটি অ্যাক্সেস করতে হবে:

MyNewType.MyStaticMember();

সুতরাং, কোডটিতে ব্যবহৃত হওয়ার সময় নতুন আইটেমটি মূলটির সাথে কোনও সম্পর্ক রাখে না। পলিমারফিজমের মতো বিষয়গুলির জন্য কোনও উত্তরাধিকার সম্পর্কের সুযোগ নেওয়ার কোনও উপায় থাকবে না।

সম্ভবত আপনি ভাবছেন আপনি কেবল আসল শ্রেণির কিছু আইটেম প্রসারিত করতে চান। সেক্ষেত্রে পুরোপুরি নতুন ধরণে কেবলমাত্র কোনও সদস্যকে ব্যবহার করতে বাধা দেওয়ার কিছুই নেই।

সম্ভবত আপনি বিদ্যমান স্থিতিশীল ধরণের পদ্ধতি যুক্ত করতে চান। আপনি ইতিমধ্যে এক্সটেনশন পদ্ধতির মাধ্যমে এটি করতে পারেন।

সম্ভবত আপনি Typeরানটাইমের সময় কোনও ফাংশনে স্ট্যাটিক পাস করতে এবং সেই পদ্ধতিটি কী করে তা সঠিকভাবে না জেনে সেই ধরণের একটি পদ্ধতি কল করতে সক্ষম হতে চান । সেক্ষেত্রে আপনি একটি ইন্টারফেস ব্যবহার করতে পারেন।

সুতরাং, শেষ অবধি স্থিতিশীল শ্রেণীর উত্তরাধিকার সূত্রে আপনি কিছুই অর্জন করতে পারেন না।


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

2
স্ট্যাটিক ধরণের এবং ভার্চুয়াল স্ট্যাটিক সদস্যদের সাথে উত্তরাধিকারের সম্পর্কগুলি এমনভাবে সংজ্ঞায়িত করা যায় যে কোনও SomeClass<T> where T:Fooসদস্যের অ্যাক্সেস পাওয়া যায় Fooএবং যদি Tএমন কোনও শ্রেণি ছিল যা কিছু ভার্চুয়াল স্ট্যাটিক সদস্যকে ছাড়িয়ে যায় Fooতবে জেনেরিক শ্রেণি সেই ওভাররাইডগুলিকে ব্যবহার করবে। এমন একটি কনভেনশন সংজ্ঞায়িত করাও সম্ভবত সম্ভব হবে যার মাধ্যমে ভাষাগুলি বর্তমান সিএলআরের সাথে সামঞ্জস্যপূর্ণ ফ্যাশনে এটি করতে পারে (উদাহরণস্বরূপ এই জাতীয় সদস্যদের একটি শ্রেণীর একটি সুরক্ষিত অ-স্থিতিক শ্রেণীর সংজ্ঞা দেওয়া উচিত যা একটি স্ট্যাটিক ক্ষেত্রের পাশাপাশি এই জাতীয় উদাহরণস্বরূপ সদস্য রয়েছে) এই ধরণের একটি উদাহরণ ধারণ করে)।
সুপারক্যাট

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

3

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


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

আমার ধারণা, বিকল্পটি একটি বিশাল অভিধান হবে। এছাড়াও, যখন আপনি "আপনি কী অর্জন করতে চান" বলছেন তখন তার পরিবর্তে "আপনি কী লক্ষ্য করছেন বলে মনে করেন" বা অনুরূপ কিছু বলা উচিত।
এভিনিস

3

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


2

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

সুতরাং ... যদি আপনি স্থিতিশীল সদস্যদের উত্তরাধিকারী হতে না পারেন, এবং যদি স্ট্যাটিক ক্লাসে কেবল স্থির সদস্য থাকতে পারে তবে স্থির শ্রেণীর উত্তরাধিকারসূত্রে উত্তমরূপে কী করতে হবে?


1

হুমমম ... আপনার যদি ঠিক স্ট্যাটিক পদ্ধতিতে ভরাট স্টাটিক ক্লাস থাকে তাহলে কি আরও আলাদা হবে ..?


2
এটাই আমার কাছে বাকি আছে। আমি এটি এইভাবে করি। এবং আমি এটি পছন্দ করি না।
ব্যবহারকারী

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

স্থির পদ্ধতিতে ভরা নন-স্ট্যাটিক ক্লাসে আপনি এক্সটেনশন পদ্ধতি রাখতে পারবেন না :)
জাকুব সাজাউকিউইকজ

1

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

public class TestClass<T>
{
    protected TestClass()
    { }

    public static T Add(T x, T y)
    {
        return (dynamic)x + (dynamic)y;
    }
}

public class TestClass : TestClass<double>
{
    // Inherited classes will also need to have protected constructors to prevent people from creating instances of them.
    protected TestClass()
    { }
}

TestClass.Add(3.0, 4.0)
TestClass<int>.Add(3, 4)

// Creating a class instance is not allowed because the constructors are inaccessible.
// new TestClass();
// new TestClass<int>();

দুর্ভাগ্যক্রমে "বাই ডিজাইন" ভাষার সীমাবদ্ধতার কারণে আমরা করতে পারি না:

public static class TestClass<T>
{
    public static T Add(T x, T y)
    {
        return (dynamic)x + (dynamic)y;
    }
}

public static class TestClass : TestClass<double>
{
}

1

আপনি এমন কিছু করতে পারেন যা দেখতে স্থির উত্তরাধিকারের মতো দেখাবে।

কৌশলটি এখানে:

public abstract class StaticBase<TSuccessor>
    where TSuccessor : StaticBase<TSuccessor>, new()
{
    protected static readonly TSuccessor Instance = new TSuccessor();
}

তারপরে আপনি এটি করতে পারেন:

public class Base : StaticBase<Base>
{
    public Base()
    {
    }

    public void MethodA()
    {
    }
}

public class Inherited : Base
{
    private Inherited()
    {
    }

    public new static void MethodA()
    {
        Instance.MethodA();
    }
}

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

স্ট্যাটিক মোড়ক পদ্ধতি এবং newকীওয়ার্ডের ম্যানুয়াল তৈরির প্রয়োজনের মতো ডাউনসাইড রয়েছে । তবে এই পদ্ধতির এমন কিছু সমর্থন করাতে সহায়তা করে যা স্থির উত্তরাধিকারের মতোই similar

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


1

আমার উত্তর: নকশার পছন্দ কম। ;-)

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

একটি ছদ্ম উদাহরণ, স্থির উত্তরাধিকারকে একরকমভাবে সংজ্ঞায়িত করা হয়েছে।

public static class MyStaticBase
{
    SomeType AttributeBase;
}

public static class MyStaticChild : MyStaticBase
{
    SomeType AttributeChild;
}

বাড়ে:

 // ...
 DoSomethingTo(MyStaticBase.AttributeBase);
// ...

যা (যেমন?) একই স্টোরেজকে প্রভাবিত করতে পারে

// ...
DoSomethingTo(MyStaticChild.AttributeBase);
// ...

খুবই বিভ্রান্তিকর!

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

আমি বিশ্বাস করি সীমিত স্থিতিশীল উত্তরাধিকারের জন্য একটি শক্তিশালী তথ্য স্থানের ন্যায়সঙ্গততা রয়েছে। শীঘ্রই সীমা আরও। এই সিউডোকোডটি মানটি দেখায়:

public static class MyStaticBase<T>
{
   public static T Payload;
   public static void Load(StorageSpecs);
   public static void Save(StorageSpecs);
   public static SomeType AttributeBase
   public static SomeType MethodBase(){/*...*/};
}

তারপরে আপনি পাবেন:

public static class MyStaticChild : MyStaticBase<MyChildPlayloadType>
{
   public static SomeType AttributeChild;
   public static SomeType SomeChildMethod(){/*...*/};
   // No need to create the PlayLoad, Load(), and Save().
   // You, 'should' be prevented from creating them, more on this in a sec...
} 

ব্যবহারের মতো দেখাচ্ছে:

// ...
MyStaticChild.Load(FileNamePath);
MyStaticChild.Save(FileNamePath);
doSomeThing(MyStaticChild.Payload.Attribute);
doSomething(MyStaticChild.AttributeBase);
doSomeThing(MyStaticChild.AttributeChild);
// ...

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

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

আমি বিশ্বাস করি যে সঠিক নকশার পছন্দটি নির্দিষ্ট সীমাবদ্ধতার সাথে স্থির উত্তরাধিকারকে মঞ্জুর করা হবে:

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

আপনি এখনও জেনেরিক রেফারেন্সের মাধ্যমে একই স্টোরটি পরিবর্তন করতে পারেন MyStaticBase<ChildPayload>.SomeBaseField। জেনেরিক প্রকারটি নির্দিষ্ট করতে হবে বলে আপনি নিরুৎসাহিত হবেন। শিশু রেফারেন্স ক্লিনার হবে যদিও: MyStaticChild.SomeBaseField

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


0

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

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

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

স্থিতিশীল শ্রেণীর প্রধান বৈশিষ্ট্যগুলি নিম্নলিখিত:

  1. এগুলিতে কেবল স্থির সদস্য থাকে।

  2. এগুলি তাত্ক্ষণিকভাবে চালু করা যায় না।

  3. তারা সিল করা হয়।

  4. এগুলিতে ইনস্ট্যান্স কনস্ট্রাক্টর (সি # প্রোগ্রামিং গাইড) থাকতে পারে না।

স্ট্যাটিক ক্লাস তৈরি করা মূলত এমন ক্লাস তৈরির মতো যা কেবল স্থিতিশীল সদস্য এবং একটি প্রাইভেট কনস্ট্রাক্টর থাকে। একটি প্রাইভেট কনস্ট্রাক্টর ক্লাসটি তাত্ক্ষণিকভাবে বাধা দেয়।

স্ট্যাটিক ক্লাস ব্যবহারের সুবিধা হ'ল সংকলক কোনও ঘটনাক্রমে কোনও সদস্য সদস্য যুক্ত না হয়েছে তা নিশ্চিত করে পরীক্ষা করতে পারে। সংকলক গ্যারান্টি দেয় যে এই শ্রেণীর উদাহরণগুলি তৈরি করা যাবে না।

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


-1

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

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