উত্তরাধিকারসূত্রে প্রাপ্ত সদস্যদের লুকিয়ে রাখুন

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

এই ক্লাসগুলি সব নিয়ন্ত্রণগুলি যা wpf বা Silverlight 2.0 এর জন্য কম্পাইল করা হয়। আমি ICustomTypeDescriptor এবং ICustomPropertyProvider সম্পর্কে জানি, কিন্তু আমি পুরোপুরি নিশ্চিত যে সেগুলি সিলেক্টরে ব্যবহার করা যাবে না।

এটি একটি কার্যকারিতা বিষয় হিসাবে অনেক কার্যকরী সমস্যা নয়। আমার কি করা উচিৎ?

এ আপডেট করুন

কিছু কিছু বৈশিষ্ট্য যা আমি আমার পূর্বপুরুষদের কাছ থেকে গোপন করতে চাই যা আমার নিজস্ব নয় এবং নির্দিষ্ট টুলের কারণে আমি ডিজাইন করছি, আমি new অপারেটরের সাথে লুকিয়ে থাকতে পারি না। (আমি জানি, এটা হাস্যকর)

0

8 উত্তর

যদিও আপনি আমার উত্তরাধিকারসূত্রে প্রাপ্ত সদস্যের ব্যবহারকে আমার জ্ঞান থেকে আটকাতে পারেন না, তবে আপনি সম্পাদকব্লবএবলঅ্যাট্রিবিউট :

Using System.ComponentModel;

[EditorBrowsable(EditorBrowsableState.Never)]
private string MyHiddenString = "Muahahahahahahahaha";

Edit: Just saw this in the documentation comments, which makes it kinda useless for this purpose:

একটি বিশিষ্ট নোট আছে যা এই বৈশিষ্ট্যটি "একই সমাবেশে একটি শ্রেণী থেকে সদস্যদের দমন করে না" বলে। এটা সত্য কিন্তু সম্পূর্ণ নয়। প্রকৃতপক্ষে, অ্যাট্রিবিউট একই সমাধানে একটি ক্লাস থেকে সদস্যদের দমন করে না।

0
যোগ

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

এভাবে:

public class MyClass : BaseClass
{
    // Your stuff here
}

হয়ে:

public class MyClass
{
    private BaseClass baseClass;

    public void ExposeThisMethod()
    {
        baseClass.ExposeThisMethod();
    }
}

বা:

public class MyClass
{
    private BaseClass baseClass;

    public BaseClass BaseClass
    {
        get
        {
            return baseClass;
        }
    }
}
0
যোগ

আমি মনে করি আপনি উত্তরাধিকারের বিরোধিতার মত গঠনটি বিবেচনা করতে সবচেয়ে কম হিপিশ উপায়।

অথবা, আপনি এমন একটি ইন্টারফেস তৈরি করতে পারেন যা আপনার পছন্দসই সদস্য, আপনার প্রাপ্ত শ্রেণীকে ইন্টারফেসটি প্রয়োগ করে এবং ইন্টারফেসের বিরুদ্ধে প্রোগ্রামটি তৈরি করে।

0
যোগ

তাদের উপরে মিক্সের মতো ওভারব্রাইড দেখান উপরে এবং লোকেরা অননুমোদিত (এসপ্?) পদ্ধতিগুলি ব্যবহার করতে প্রতিরোধ করতে, তাদের অপ্রচলিত হিসাবে চিহ্নিত করুন:

[Obsolete("These are not supported in this class.", true)]
public override  void dontcallmeanymore()
{
}

দ্বিতীয় পারমটি সত্য সেট করা হলে, যে কেউ এই পদ্ধতিতে কল করার চেষ্টা করে এবং প্রথম প্যারামালের স্ট্রিংটি বার্তা হয় তাহলে একটি কম্পাইলার ত্রুটি তৈরি করা হবে। যদি parm2 মিথ্যা হয় শুধুমাত্র একটি কম্পাইলার সতর্কবার্তা উত্পন্ন হবে।

0
যোগ
আপনি একই প্রভাব সঙ্গে, এটি সীল পারেন না?
যোগ লেখক James M, উৎস
@ রবার্টপেট যখন অপ্রচলিত ব্যবহার করে, এটি একটি সতর্কতা দেয়, একটি ত্রুটি নয়। বড় পার্থক্য.
যোগ লেখক James M, উৎস
@ রোবটপেটজ, আপনি স্পষ্টতই খনি পড়েননি, তবে নিরবচ্ছিন্ন উপহাসের জন্য কুদ।
যোগ লেখক James M, উৎস
@ জেমস মিলে সত্যিকারের কোনও অব্যবহৃত সদস্য সদস্যকে অ্যাক্সেস বাধা দেয় না, সীলমোহরটি বন্ধ করে দেয় সদস্য উত্তরাধিকার । সুতরাং একটি সিল বর্গ থেকে প্রাপ্ত করা যাবে না, এবং একটি সিল এর পদ্ধতি অন্য শ্রেণী সদস্যদের overridden করা অনুমোদিত কিন্তু সেটি overridden হচ্ছে থেকে বাধা দেয়। সীল যে শ্রেণীর বা সদস্যকে আহ্বান রোধ করে না, যদি আপনি এটি আহ্বান করার চেষ্টা করেন তবে সত্যের সাথে obselete একটি কম্পাইলার ত্রুটি ছুঁড়ে দেয়।
যোগ লেখক Robert Petz, উৎস
@ জেমসম ইউহ ... আপনি কি উত্তর দিয়েছিলেন যা আপনি প্রথমে মন্তব্য করেছিলেন?
যোগ লেখক Robert Petz, উৎস
@ জেমস ল লুল আমি করেছি, এজন্যই আমি আপনাদের মূল প্রশ্নের উত্তর দিয়েছি যে কেন সীল একই কাজ সম্পাদন করেনি। তারপর আপনি লক্ষ করেছেন যে বাতিল করা শুধুমাত্র একটি সতর্কতা প্রদান করে, যা অন্য কোড <true> true এর অন্য যুক্তি হিসাবে সতর্কতার পরিবর্তে কম্পাইলার ত্রুটি করে - যেমনটি আপনি সরাসরি মন্তব্য করেছেন যুক্তরাষ্ট্র। আমি আপনাকে ভুল বুঝছি না, আমি স্পষ্টতা স্বাগত জানাই। এখানে MSDN উত্স
যোগ লেখক Robert Petz, উৎস

আমি জানি এটির বেশ কিছু উত্তর রয়েছে, এবং এটি এখন বেশ পুরনো, কিন্তু এটি করার সবচেয়ে সহজ পদ্ধতি হল কেবলমাত্র new private হিসাবে ঘোষণা করে।

একটি উদাহরণ বিবেচনা করুন আমি বর্তমানে কাজ করছি, যেখানে আমি একটি API যে একটি তৃতীয় পক্ষের DLL প্রতিটি পদ্ধতি উপলব্ধ উপলব্ধ আছে আমি তাদের পদ্ধতি নিতে হবে, কিন্তু আমি একটি "getThisValue" এবং "setThisValue" পদ্ধতি পরিবর্তে একটি .net সম্পত্তি ব্যবহার করতে চান। সুতরাং, আমি একটি দ্বিতীয় শ্রেণি তৈরি করি, প্রথমে উত্তরাধিকারসূত্রে পাওয়া, একটি সম্পত্তি তৈরি করি যা পেতে এবং সেট পদ্ধতিগুলি ব্যবহার করে, এবং তারপর মূল পেতে এবং ব্যক্তিগত হিসাবে সেট পদ্ধতিগুলি ওভাররাইড করে। তারা এখনও তাদের উপর কিছু ভিন্ন নির্মাণ করতে চান যে কেউ পাওয়া যায়, কিন্তু যদি তারা শুধু ইঞ্জিন আমি নির্মাণ করছি ব্যবহার করতে চান, তাহলে তারা পদ্ধতি পরিবর্তে বৈশিষ্ট্য ব্যবহার করতে সক্ষম হবেন।

ডবল শ্রেণী পদ্ধতি ব্যবহার করে সদস্যদের গোপন করার জন্য new ঘোষণা ব্যবহার করতে অসমর্থ হওয়া সীমাবদ্ধতা পরিহার করে। আপনি যদি ভার্চুয়াল হিসাবে চিহ্নিত করা হয় তবে আপনি সহজেই override ব্যবহার করতে পারবেন না।

public class APIClass
{
    private static const string DllName = "external.dll";

    [DllImport(DllName)]
    public extern unsafe uint external_setSomething(int x, uint y);

    [DllImport(DllName)]
    public extern unsafe uint external_getSomething(int x, uint* y);

    public enum valueEnum
    {
        On = 0x01000000;
        Off = 0x00000000;
        OnWithOptions = 0x01010000;
        OffWithOptions = 0x00010000;
    }
}

public class APIUsageClass : APIClass
{
    public int Identifier;
    private APIClass m_internalInstance = new APIClass();

    public valueEnum Something
    {
        get
        {
            unsafe
            {
                valueEnum y;
                fixed (valueEnum* yPtr = &y)
                {
                    m_internalInstance.external_getSomething(Identifier, yPtr);
                }
                return y;
            }
        }
        set
        {
            m_internalInstance.external_setSomething(Identifier, value);
        }
    }

    new private uint external_setSomething(int x, float y) { return 0; }
    new private unsafe uint external_getSomething(int x, float* y) { return 0; }
}

এখন valueEnum উভয় ক্লাসের জন্য উপলব্ধ, কিন্তু শুধুমাত্র সম্পত্তি APIUsageClass ক্লাসে দৃশ্যমান। APIClass ক্লাস এখনও এমন ব্যক্তিদের জন্য উপলব্ধ যারা মূল API প্রসারিত করতে চান বা এটি একটি ভিন্ন উপায়ে ব্যবহার করতে চান, এবং APIUsageClass যারা আরও কিছু চান তাদের জন্য উপলব্ধ।

পরিশেষে, আমি যা করছি তা হচ্ছে APIClass অভ্যন্তরীণ, এবং শুধুমাত্র আমার উত্তরাধিকারসূত্রে শ্রেণি প্রকাশ করা।

0
যোগ
নির্ভরশীলতার বৈশিষ্ট্যগুলির জন্য এটি কিভাবে ব্যবহার করে?
যোগ লেখক James M, উৎস

আমি প্রস্তাবিত সব সমাধান পরীক্ষা এবং তারা সত্যিই নতুন সদস্যদের গোপন না।

কিন্তু এই এক আছে:

[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public new string MyHiddenProperty
{ 
    get { return _myHiddenProperty; }
}

কিন্তু কোড-বিন্যাসে এটি এখনও অ্যাক্সেসযোগ্য, তাই অপসেট অ্যাট্রিবিউট যোগ করুন

[Obsolete("This property is not supported in this class", true)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public new string MyHiddenProperty
{ 
    get { return _myHiddenProperty; }
}
0
যোগ

সম্পূর্ণরূপে লুকান এবং ব্যবহার করতে না চিহ্নিত করা, আমি বিশ্বাস করি যে intellisense সহ অধিকাংশ পাঠকদের আশা কি ...

[Obsolete("Not applicable in this class.")] 
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
0
যোগ

আপনি একটি ইন্টারফেস ব্যবহার করতে পারেন

    public static void Main()
    {
        NoRemoveList testList = ListFactory.NewList();

        testList.Add(" this is ok ");

        // not ok
        //testList.RemoveAt(0);
    }

    public interface NoRemoveList
    {
        T this[int index] { get; }
        int Count { get; }
        void Add(T item);
    }

    public class ListFactory
    {
        private class HiddenList: List, NoRemoveList
        {
            // no access outside
        }

        public static NoRemoveList NewList()
        {
            return new HiddenList();
        }
    }
0
যোগ