উত্তর:
এটি জেনেরিক পরামিতিগুলির প্রতিবন্ধকতা T
। এটি অবশ্যই একটি class
(রেফারেন্স টাইপ) হতে হবে এবং অবশ্যই একটি সর্বজনীন পরামিতি-কম ডিফল্ট কনস্ট্রাক্টর থাকতে হবে।
এর মানে হল যে T
একটি হতে পারে না int
, float
, double
, DateTime
বা অন্য কোন struct
(মান টাইপ)।
এটি একটি string
, বা অন্য কোনও কাস্টম রেফারেন্স ধরণের হতে পারে , যতক্ষণ না এটির ডিফল্ট বা পরামিতি-কম নির্মাতা থাকে।
new()
স্পষ্টভাবে নির্দিষ্ট করে "অবশ্যই একটি পাবলিক প্যারামিটারলেস কনস্ট্রাক্টর থাকতে হবে"
এগুলি জেনেরিক ধরণের সীমাবদ্ধতা। আপনার ক্ষেত্রে তাদের মধ্যে দুটি রয়েছে:
where T : class
মানে টাইপটি T
অবশ্যই একটি রেফারেন্স টাইপ (মান ধরণের নয়)।
where T : new()
এর অর্থ হল যে ধরণের T
অবশ্যই প্যারামিটার-কম কনস্ট্রাক্টর থাকতে হবে। এই সীমাবদ্ধতা থাকার ফলে আপনি T field = new T();
আপনার কোডে এমন কিছু করতে পারবেন যা আপনি অন্যথায় করতে সক্ষম হবেন না।
এরপরে আপনি দুজনকে কমা ব্যবহার করে একত্রিত করে পেতে:
where T : class, new()
যেখানে টি: কাঠামো
প্রকারের যুক্তিটি একটি মান ধরণের হতে হবে। নলেবল ব্যতীত কোনও মানের ধরণ নির্দিষ্ট করা যেতে পারে। আরও তথ্যের জন্য নুলযোগ্য প্রকারগুলি (সি # প্রোগ্রামিং গাইড) ব্যবহার করে দেখুন।
যেখানে টি: শ্রেণি
প্রকারের যুক্তিটি কোনও শ্রেণি, ইন্টারফেস, প্রতিনিধি বা অ্যারের প্রকার সহ একটি রেফারেন্স টাইপ হতে হবে। (নীচের নোট দেখুন।)
যেখানে টি: নতুন () টাইপ আর্গুমেন্টের একটি সর্বজনীন পরামিতি বিহীন নির্মাণকারী থাকতে হবে। অন্যান্য সীমাবদ্ধতার সাথে একযোগে ব্যবহৃত হলে, নতুন () সীমাবদ্ধতা অবশ্যই শেষ নির্দিষ্ট করতে হবে।
যেখানে টি: [বেস শ্রেণীর নাম]
প্রকারের যুক্তিটি অবশ্যই নির্দিষ্ট বেস শ্রেণীর হতে হবে বা নেওয়া উচিত।
যেখানে টি: [ইন্টারফেসের নাম]
ধরণের আর্গুমেন্ট অবশ্যই নির্দিষ্ট ইন্টারফেসের হতে হবে বা প্রয়োগ করতে হবে। একাধিক ইন্টারফেস সীমাবদ্ধতা নির্দিষ্ট করা যেতে পারে। সীমাবদ্ধ ইন্টারফেসটি জেনেরিকও হতে পারে।
যেখানে টি: ইউ
টির জন্য সরবরাহ করা ধরণের আর্গুমেন্টটি অবশ্যই ইউ এর জন্য সরবরাহ করা যুক্তি থেকে বা প্রাপ্ত হওয়া উচিত This এটিকে নগ্ন টাইপের সীমাবদ্ধতা বলা হয়।
class
& new
2 হয় জেনেরিক টাইপ প্যারামিটার উপর সীমাবদ্ধতাT
।
যথাযথভাবে তারা নিশ্চিত করে:
class
প্রকারের যুক্তিটি অবশ্যই একটি রেফারেন্স টাইপ হতে হবে; এটি কোনও শ্রেণি, ইন্টারফেস, প্রতিনিধি বা অ্যারে প্রকারের ক্ষেত্রেও প্রযোজ্য।
new
টাইপ আর্গুমেন্টের একটি সর্বজনীন প্যারামিটারলেস কনস্ট্রাক্টর থাকতে হবে। অন্যান্য সীমাবদ্ধতার সাথে একসাথে ব্যবহার করার সময়, নতুন () সীমাবদ্ধতা অবশ্যই শেষ নির্দিষ্ট করতে হবে।
তাদের সংমিশ্রণের অর্থ হ'ল টাইপটি T
অবশ্যই একটি রেফারেন্স টাইপ ( মান ধরণের হতে পারে না ) হতে পারে এবং অবশ্যই প্যারামিটারলেস কনস্ট্রাক্টর থাকতে হবে।
উদাহরণ:
struct MyStruct { } // structs are value types
class MyClass1 { } // no constructors defined, so the class implicitly has a parameterless one
class MyClass2 // parameterless constructor explicitly defined
{
public MyClass2() { }
}
class MyClass3 // only non-parameterless constructor defined
{
public MyClass3(object parameter) { }
}
class MyClass4 // both parameterless & non-parameterless constructors defined
{
public MyClass4() { }
public MyClass4(object parameter) { }
}
interface INewable<T>
where T : new()
{
}
interface INewableReference<T>
where T : class, new()
{
}
class Checks
{
INewable<int> cn1; // ALLOWED: has parameterless ctor
INewable<string> n2; // NOT ALLOWED: no parameterless ctor
INewable<MyStruct> n3; // ALLOWED: has parameterless ctor
INewable<MyClass1> n4; // ALLOWED: has parameterless ctor
INewable<MyClass2> n5; // ALLOWED: has parameterless ctor
INewable<MyClass3> n6; // NOT ALLOWED: no parameterless ctor
INewable<MyClass4> n7; // ALLOWED: has parameterless ctor
INewableReference<int> nr1; // NOT ALLOWED: not a reference type
INewableReference<string> nr2; // NOT ALLOWED: no parameterless ctor
INewableReference<MyStruct> nr3; // NOT ALLOWED: not a reference type
INewableReference<MyClass1> nr4; // ALLOWED: has parameterless ctor
INewableReference<MyClass2> nr5; // ALLOWED: has parameterless ctor
INewableReference<MyClass3> nr6; // NOT ALLOWED: no parameterless ctor
INewableReference<MyClass4> nr7; // ALLOWED: has parameterless ctor
}
নতুন (): নতুন () সীমাবদ্ধতা নির্দিষ্ট করার অর্থ টাইপ টি অবশ্যই প্যারামিটারলেস কনস্ট্রাক্টর ব্যবহার করতে হবে, সুতরাং কোনও বস্তু এটি থেকে ইনস্ট্যান্ট করা যেতে পারে - ডিফল্ট কনস্ট্রাক্টরগুলি দেখুন ।
শ্রেণি: মানে টি অবশ্যই একটি রেফারেন্স টাইপ হতে হবে সুতরাং এটি কোনও ইনট, ফ্লোট, ডাবল, ডেটটাইম বা অন্যান্য কাঠামো (মানের ধরণ) হতে পারে না।
public void MakeCars()
{
//This won't compile as researchEngine doesn't have a public constructor and so can't be instantiated.
CarFactory<ResearchEngine> researchLine = new CarFactory<ResearchEngine>();
var researchEngine = researchLine.MakeEngine();
//Can instantiate new object of class with default public constructor
CarFactory<ProductionEngine> productionLine = new CarFactory<ProductionEngine>();
var productionEngine = productionLine.MakeEngine();
}
public class ProductionEngine { }
public class ResearchEngine
{
private ResearchEngine() { }
}
public class CarFactory<TEngine> where TEngine : class, new()
{
public TEngine MakeEngine()
{
return new TEngine();
}
}
তার অর্থ এই ধরণের T
অবশ্যই একটি শ্রেণি হতে হবে এবং এমন একটি নির্মাণকারী থাকতে হবে যা কোনও যুক্তি গ্রহণ করে না।
উদাহরণস্বরূপ, আপনার অবশ্যই এটি করতে সক্ষম হবেন:
T t = new T();
নতুন () সীমাবদ্ধতাটি সংকলককে জানতে দেয় যে সরবরাহিত যে কোনও ধরণের আর্গুমেন্টের অবশ্যই একটি অ্যাক্সেসযোগ্য প্যারামিটারলেস - বা ডিফল্ট-- কনস্ট্রাক্টর থাকতে হবে
সুতরাং এটি হওয়া উচিত, T
অবশ্যই একটি শ্রেণি হতে হবে এবং একটি অ্যাক্সেসযোগ্য প্যারামিটারলেস - বা ডিফল্ট কনস্ট্রাক্টর থাকতে হবে।
"যেখানে" এর পরে যা আসে তা হ'ল জেনেরিক ধরণের টি আপনি ঘোষণা করেছিলেন, তাই:
শ্রেণীর অর্থ হল টি টি একটি শ্রেণি হওয়া উচিত এবং মান মান বা স্ট্রাক্ট নয়।
নতুন () নির্দেশ করে যে টি শ্রেণিতে একটি সর্বজনীন পরামিতি-মুক্ত ডিফল্ট কনস্ট্রাক্টর সংজ্ঞায়িত করা উচিত।
জেনেরিক প্যারামিটার টিতে একে 'সীমাবদ্ধতা' বলা হয় It এর অর্থ হল টি অবশ্যই একটি রেফারেন্স টাইপ (একটি শ্রেণি) হতে হবে এবং এর অবশ্যই একটি সর্বজনীন ডিফল্ট কনস্ট্রাক্টর থাকতে হবে।
এটি জেনেরিক্স মেকানিজমের অংশ, যেখানে টাইপ প্যারামিটার হিসাবে কীওয়ার্ড প্রয়োগ করতে হবে কোন প্রকারের প্রয়োগ করতে হবে তাতে সীমাবদ্ধতা রয়েছে।