c# - Subclasses ক্ষেত্র বা বৈশিষ্ট্য overriding




properties field (6)

আপনি এই মত কিছু সংজ্ঞায়িত করতে পারে:

abstract class Father
{
    //Do you need it public?
    protected readonly int MyInt;
}

class Son : Father
{
    public Son()
    {
        MyInt = 1;
    }
}

মানটিকে কেবলমাত্র পাঠ্য হিসাবে সেট করে, এটি নিশ্চিত করে যে ক্লাসের মান বস্তুর জীবনকালের জন্য অপরিবর্তিত থাকে।

আমি মনে করি পরবর্তী প্রশ্নটি হল: কেন আপনি এটি প্রয়োজন?

আমার একটি বিমূর্ত বেস বর্গ আছে এবং আমি একটি ক্ষেত্র বা একটি সম্পত্তি ঘোষণা করতে চাই যা প্রত্যেকটি শ্রেণিতে ভিন্ন মানের থাকবে যা এই অভিভাবক শ্রেণীর উত্তরাধিকারসূত্রে প্রাপ্ত।

আমি বেসক্লাসে এটি সংজ্ঞায়িত করতে চাই তাই আমি এটি বেস বর্গ পদ্ধতিতে উল্লেখ করতে পারি - উদাহরণস্বরূপ, "এই বস্তুটি সম্পত্তি / ক্ষেত্রের " বলার জন্য টোস্টিংকে ওভাররাইড করা। আমি তিনটি উপায় পেয়েছি যা আমি এই কাজটি দেখতে পাচ্ছি, কিন্তু আমি ভাবছিলাম - এটি করার সেরা বা গ্রহণযোগ্য উপায় কী? নবীন প্রশ্ন, দুঃখিত।

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

abstract class Father
{
    abstract public int MyInt { get; set;}
}

class Son : Father
{
    public override int MyInt
    {
        get { return 1; }
        set { }
    }
}

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

abstract class Mother
{
    public int MyInt = 0;
}

class Daughter : Mother
{
    public int MyInt = 1;
}

বিকল্প 3
আমি একটি সুরক্ষিত ক্ষেত্র ব্যবহার করতে এবং কনস্ট্রাক্টর মান সেট করতে পারেন। এটি বেশ পরিষ্কার মনে হচ্ছে তবে কনস্ট্রাক্টর সবসময় এটি সেট করে এবং আমার একাধিক ওভারলোডযুক্ত কনস্ট্রাক্টরগুলির সাথে এটি নিশ্চিত করে যে কিছু কোড পথ মান সেট করবে না।

abstract class Aunt
{
    protected int MyInt;
}

class Niece : Aunt
{
    public Niece()
    {
        MyInt = 1;
    }
}

এটি একটি তাত্ত্বিক প্রশ্নটির একটি বিট এবং আমি মনে করি উত্তরটি বিকল্প 1 হতে হবে কারণ এটি একমাত্র নিরাপদ বিকল্প তবে আমি কেবল C # এর সাথে জড়িত হচ্ছি এবং আরো অভিজ্ঞতার সাথে এই লোকেদের জিজ্ঞাসা করতে চাই।


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

class x
{
    private int _myInt;
    internal virtual int myInt { get { return _myInt; } set { _myInt = value; } }
}

class y : x
{
    private int _myYInt;
    public override int myInt { get { return _myYInt; } set { _myYInt = value; } }
}

ভার্চুয়াল আপনি একটি সম্পত্তি একটি শরীর যা কিছু করতে দেয় এবং এখনও উপ-ক্লাস এটি override করতে দেয়।


আমি এটা করেছি...

namespace Core.Text.Menus
{
    public abstract class AbstractBaseClass
    {
        public string SELECT_MODEL;
        public string BROWSE_RECORDS;
        public string SETUP;
    }
}

namespace Core.Text.Menus
{
    public class English : AbstractBaseClass
    {
        public English()
        {
            base.SELECT_MODEL = "Select Model";
            base.BROWSE_RECORDS = "Browse Measurements";
            base.SETUP = "Setup Instrument";
        }
    }
}

এই ভাবে আপনি এখনও ক্ষেত্র ব্যবহার করতে পারেন।


আমি বিকল্প 3 দিয়ে যেতে চাই, কিন্তু একটি বিমূর্ত setMyInt পদ্ধতি আছে subclasses বাস্তবায়ন বাধ্য করা হয়। এইভাবে আপনি কন্সট্রাক্টারে সেট করতে ভুলে যাওয়া ডেরিভেড শ্রেণির সমস্যাটি পাবেন না।

abstract class Base 
{
 protected int myInt;
 protected abstract void setMyInt();
}

class Derived : Base 
{
 override protected void setMyInt()
 {
   myInt = 3;
 }
}

যাইহোক, বিকল্প এক দিয়ে, যদি আপনি সেট নির্দিষ্ট না করেন; আপনার বিমূর্ত বেস বর্গ সম্পত্তি, derived বর্গ এটি বাস্তবায়ন করতে হবে না।

abstract class Father
{
    abstract public int MyInt { get; }
}

class Son : Father
{
    public override int MyInt
    {
        get { return 1; }
    }
}

বিকল্প 2 একটি অ স্টার্টার - আপনি ক্ষেত্রগুলি ওভাররাইড করতে পারবেন না, আপনি কেবল তাদের লুকিয়ে রাখতে পারেন।

ব্যক্তিগতভাবে, আমি প্রত্যেক সময় বিকল্প 1 যেতে চাই। আমি সব সময় ক্ষেত্র ব্যক্তিগত রাখতে চেষ্টা করুন। অবশ্যই যদি আপনি অবশ্যই অবশ্যই সম্পত্তিটি ওভাররাইড করতে সক্ষম হবেন। অন্য বিকল্পটি হল বেস ক্লাসে কেবলমাত্র পঠনযোগ্য সম্পত্তি থাকা যা একটি কনস্ট্রাক্টর প্যারামিটার থেকে সেট করা হয়:

abstract class Mother
{
    private readonly int myInt;
    public int MyInt { get { return myInt; } }

    protected Mother(int myInt)
    {
        this.myInt = myInt;
    }
}

class Daughter : Mother
{
    public Daughter() : base(1)
    {
    }
}

মানটি জীবনের দৃষ্টিকোণ থেকে পরিবর্তন না করলে সম্ভবত এটি সবচেয়ে উপযুক্ত পদ্ধতি।


বিকল্প 2 একটি খারাপ ধারণা। এটা কিছু shadowowing বলা হবে; মূলত আপনি দুটি ভিন্ন "MyInt" সদস্য আছে, একটি মায়ের মধ্যে, এবং অন্য মেয়ে। এর সাথে সমস্যা, মায়ের মধ্যে যে পদ্ধতিগুলি প্রয়োগ করা হয়েছে তা মায়ের "মাইইন্ট" উল্লেখ করবে, কন্যা বাস্তবায়নের পদ্ধতিগুলি মেয়ের "মাইইন্ট" উল্লেখ করবে। এই কিছু গুরুতর পঠনযোগ্যতা সমস্যা, এবং লাইন ডাউন পরে বিভ্রান্তির কারণ হতে পারে।

ব্যক্তিগতভাবে, আমি মনে করি সেরা বিকল্প 3; কারণ এটি একটি স্পষ্ট কেন্দ্রীভূত মান সরবরাহ করে এবং শিশুদের দ্বারা অভ্যন্তরীণভাবে তাদের নিজস্ব ক্ষেত্রগুলি সংজ্ঞায়িত করার ঝুঁকি ছাড়াই উল্লেখ করা যেতে পারে - যা বিকল্প 1 এর সমস্যা।







field