সি # তে এই আপাত স্ব-রেফারেন্সের উদ্দেশ্য কী?


21

আমি আমার একটি প্রকল্পে ব্যবহারের জন্য পিরানহা ( http://piranhacms.org/ ) নামে একটি ওপেন সোর্স সিএমএস মূল্যায়ন করছি । আমি নিম্নলিখিত কোডটি আকর্ষণীয় এবং কিছুটা বিভ্রান্তিকর পেয়েছি, কমপক্ষে আমার কাছে। কিছু আমাকে বুঝতে বুঝতে সহায়তা করতে পারে যে ক্লাসটি কেন একই ধরণের গোড়া থেকে উত্তরাধিকার সূত্রে প্রাপ্ত?

public abstract class BasePage<T> : Page<T> where T : BasePage<T>
{
    /// <summary>
    /// Gets/sets the page heading.
    /// </summary>
    [Region(SortOrder = 0)]
    public Regions.PageHeading Heading { get; set; }
}

যদি কোনও শ্রেণির BasePage<T>সংজ্ঞা দেওয়া হচ্ছে তবে উত্তরাধিকারী হবেন কেন Page<T> where T: BasePage<T>? এটি কোন নির্দিষ্ট উদ্দেশ্যে কাজ করে?



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

বন্ধ হয়ে গেলে কেবল চারদিকে ঝুলুন এবং এটি আবার খুলুন।
ডেভিড আরনো

এফ-সীমাবদ্ধ পলিমারফিজমের ধারণাটি পড়ুন :)
আইভিন্দ

1
অ্যাভিন্ড আমি আসলেই করেছি। এফ- বাউন্ডেড পলিমারফিজম
অক্সিফেনগ /

উত্তর:


13

কিছু আমাকে বুঝতে বুঝতে সহায়তা করতে পারে যে ক্লাসটি কেন একই ধরণের গোড়া থেকে উত্তরাধিকার সূত্রে প্রাপ্ত?

এটি নয়, এটি উত্তরাধিকার সূত্রে প্রাপ্ত Page<T>, তবে Tনিজে থেকেই উদ্ভূত এমন এক ধরণের মাধ্যমে প্যারামিটারাইজড হতে বাধ্য BasePage<T>

কেন তা নির্ধারণ করতে, আপনাকে কীভাবে প্যারামিটার টাইপ Tব্যবহৃত হয় তা দেখতে হবে। কিছু খনন করার পরে, উত্তরাধিকার শৃঙ্খলাটি উপরে উঠার সাথে সাথে আপনি এই শ্রেণীর উপরে উঠে আসবেন:

( গিথুব )

public class GenericPage<T> : PageBase where T : GenericPage<T>
{
    public bool IsStartPage {
        get { return !ParentId.HasValue && SortOrder == 0; }
    }

    public GenericPage() : base() { }

    public static T Create(IApi api, string typeId = null)
    {
        return api.Pages.Create<T>(typeId);
    }
}

আমি যতদূর দেখতে পাচ্ছি, জেনেরিক সীমাবদ্ধতার একমাত্র উদ্দেশ্য হ'ল Createপদ্ধতিটি সর্বনিম্ন বিমূর্ত প্রকারটিকে সম্ভব করে তোলে কিনা তা নিশ্চিত করা ।

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

নোট করুন যে এটি তাদের প্রতিবিম্ব এড়াতে দেয় না - এটি api.Pagesহ'ল পৃষ্ঠাগুলির সংগ্রহস্থল যা এটি প্রাপ্ত করে এবং পদ্ধতিতে typeof(T).Nameএটি পাস করে ( এখানে দেখুন )।typeIdcontentService.Create


5

এর একটি সাধারণ ব্যবহার স্ব-ধরণের ধারণার সাথে সম্পর্কিত: একটি টাইপ প্যারামিটার যা বর্তমান ধরণের সমাধান করে। ধরা যাক আপনি একটি clone()পদ্ধতির সাথে একটি ইন্টারফেস সংজ্ঞায়িত করতে চান । clone()পদ্ধতি সবসময় বর্গ উপর তা বলা হত একটি দৃষ্টান্ত ফিরে আসবে। আপনি কিভাবে এই পদ্ধতি ঘোষণা করবেন? একটি জেনেরিক সিস্টেমে স্ব-টাইপ রয়েছে এটি সহজ। আপনি শুধু এটি ফিরে বলে self। সুতরাং যদি আমি একটি বর্গ আছে Foo, ক্লোন পদ্ধতি রিটার্ন ঘোষণা করা আবশ্যক Foo। জাভাতে এবং (একটি ক্রসারী অনুসন্ধান থেকে) সি #, এটি কোনও বিকল্প নয়। আপনি পরিবর্তে এই ক্লাসে যেমন দেখেন তেমন ঘোষণাগুলি দেখুন। এটি বুঝতে গুরুত্বপূর্ণ যে এটি স্ব-টাইপের মতো একই জিনিস নয় এবং এটি সরবরাহ করে যে বিধিনিষেধগুলি দুর্বল। আপনার যদি একটি Fooএবং একটি Barক্লাস থাকে যা উভয়ই থেকে প্রাপ্তBasePage, আপনি (যদি আমি ভুল না করে থাকি) বর্ণনা করতে পারেন ফু দ্বারা স্থিতিমাপ করা Bar। এটি কার্যকর হতে পারে তবে আমি মনে করি সাধারণত, বেশিরভাগ সময় এটি একটি স্ব-টাইপের মতো ব্যবহার করা হবে এবং এটি ঠিক বোঝা গেছে যে আপনি অন্যদিকে অন্যরকম কিছু করতে পারেন এবং এটি করতে পারেন, এটি আপনার করা উচিত নয়। আমি এই ধারণাটি নিয়ে অনেক আগে খেলা করেছি তবে এই সিদ্ধান্তে পৌঁছেছি যে জাভা জেনেরিকের সীমাবদ্ধতার কারণে এটি চেষ্টা করা উচিত নয়। সি # জেনেরিকগুলি অবশ্যই আরও সম্পূর্ণ বৈশিষ্ট্যযুক্ত তবে মনে হয় এটির একই সীমাবদ্ধতা রয়েছে।

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


3

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

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

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